Ferlipse ile The Escapists 2'de Sınırları Zorla: Kaçışın Yeni Şifresi!

ferlipse-wallpaper.png


Ferlipse ile The Escapists 2'de Sınırları Zorla: Kaçışın Yeni Şifresi!

The Escapists 2'de özgürlüğünüze giden yolu daha eğlenceli ve yaratıcı hale getirmek için geliştirdiğim Ferlipse'i sunacağım. Bu özel hile menüsü, oyunun sunduğu zorlukları aşarken size yeni stratejiler ve imkanlar tanıyacak. Artık hapishane yaşamının sınırlarını zorlayarak, kaçış planlarınızı daha heyecan verici hale getirebilirsiniz. Bu rehberde, Ferlipse'in yapım sürecini ve kodlama aşamalarını adım adım anlatacağım. Tek başıma geliştirdiğim bu hile menüsünün her bir detayını sizinle paylaşarak, benzer projeleri nasıl hayata geçirebileceğinizi göstereceğim.
  1. Ferlipse'in temel özellikleri ve sunduğu imkanlar.
  2. Ferlipse'in kodlama sürecinin detayları.



ss.png


Ferlipse'in temel özellikleri ve sunduğu imkanlar
Ferlipse size oyunda daha rahat ve özgürce dolaşmanıza olanak tanır.
  1. Noclip AÇIK: Duvarların içinden geçme özelliğini aktifleştirir.
  2. GodMode AÇIK: Oyuncuyu ölümsüz hale getirir, hiçbir hasar alınmaz.
  3. SpeedHack AÇIK: Oyuncunun hareket hızını artırır.
  4. Tüm Kapıları Aç: Haritadaki tüm kapıları anında açar.
  5. Lockdown OFF: Hapishane kilitlenmesini devre dışı bırakır.
  6. Köpekleri Devre Dışı Bırak: Köpekler oyundan çıkarılır.
  7. Vurulabilir Köpekler KAPALI: Köpeklere zarar verilmesini devre dışı bırakır.
  8. Elektrikli Çitler: Elektrikli çitlerin etkinliğini yönetir.
  9. Tüm Kapıların Kilidini Açın: Tüm kapıların kilidini açar.
  10. Tüm NPC'ler Vurulabilir: NPC'lerin vurulabilir hale gelmesini sağlar.
  11. Maksimum Oyuncu İstatistikleri: Oyuncunun tüm istatistiklerini maksimum seviyeye çıkarır.



Ferlipse'in kodlama sürecinin detayları

Proje ilk başta polislerin yerlerini kutu içinde gösteren ve hangi sandıkta hangi eşyaların bulunduğunu yazan bir menü oluşturma amacı taşıyordu. İlk olarak, oyuncular için kolaylık sağlamak amacıyla bir API veya SDK kullanmayı planladım. Ancak, araştırmalarım sonucunda bu ikisinin de resmi olarak mevcut olmadığını gördüm.

Bu nedenle farklı bir yol izlemeye karar verdim ve oyunun dosyalarını incelemeye başladım. İncelemelerim sırasında genellikle oyunun yönetim klasörüne rastladım. Burada, Assembly-CSharp.dll dosyasını buldum. Sonraki adım, bu Assembly kodlarını düzenleyecek bir araç bulmak ve kullanmaktı. Bunun için dnSPY'i seçtim.




Şimdi, Ferlipse'in temel işlevlerini nasıl kodladığımı adım adım açıklayacağım:

İlk olarak dnSPY da klasörümüzü açmamız gerekiyor bunun için Dosya › Aç (Ctrl+O) tıklıyor, oyumuzun olduğu klasöre geliyor ve örnek bu yolu takip ediyoruz: C:\Program Files (x86)\Steam\steamapps\common\The Escapists 2\TheEscapists2_Data\Managed/Assembly-CSharp.dll


ss2.png
Ardından dosyaya sağ tıklıyor, Tür oluştur diyoruz ve isimlendirmelerimizi yapıyoruz. Tamam'a tıklıyor ve kodlama kısmına geçiş yapıyoruz.


C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
C#:
namespace FerlipseMenu
{
    // Ferlipse adında bir sınıf tanımlanıyor, bu sınıf MonoBehaviour'dan türetiliyor
    public class Ferlipse : MonoBehaviour
    {
        // Menü çizim fonksiyonu
        public static void DrawMenu()
        {
            // Menü ve butonlar için GUI stilleri oluşturuluyor
            GUIStyle guistyle = new GUIStyle(GUI.skin.box);
            guistyle.padding = new RectOffset(10, 10, 10, 10);
            guistyle.margin = new RectOffset(10, 10, 10, 10);
            guistyle.normal.background = Ferlipse.MakeTexture(2, 2, new Color(0.114f, 0.118f, 0.153f));
            Ferlipse.buttonStyle = new GUIStyle(GUI.skin.button);
            Ferlipse.buttonStyle.fontSize = 14;
            Ferlipse.buttonStyle.alignment = TextAnchor.MiddleCenter;
            Ferlipse.buttonStyle.normal.textColor = new Color(0.929f, 0.949f, 0.957f);
            Ferlipse.buttonStyle.normal.background = Ferlipse.MakeTexture(2, 2, new Color(1f, 0f, 0f));
            Ferlipse.buttonStyle.hover.background = Ferlipse.MakeTexture(2, 2, new Color(0.8f, 0f, 0f));
            Ferlipse.labelStyle = new GUIStyle();
            Ferlipse.labelStyle.fontSize = 15;
            Ferlipse.labelStyle.alignment = TextAnchor.MiddleCenter;
            Ferlipse.labelStyle.normal.textColor = new Color(0.784f, 0f, 0.094f);
            
            // Menü alanının başlaması
            GUILayout.BeginArea(new Rect(0f, 0f, 540f, 300f), guistyle);
            GUI.Label(new Rect(10f, 10f, 510f, 30f), Ferlipse.MenuLabel, Ferlipse.labelStyle);
            
            // Noclip butonu
            if (GUI.Button(new Rect(10f, 50f, 250f, 30f), Ferlipse.NoclipLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.NoclipActive = !Ferlipse.NoclipActive;
                Rigidbody component = T17NetView.Find<Player>(2974).gameObject.GetComponent<Rigidbody>();
                if (Ferlipse.NoclipActive)
                {
                    Ferlipse.NoclipLabel = "Noclip AÇIK";
                    component.detectCollisions = false;
                }
                else
                {
                    Ferlipse.NoclipLabel = "Noclip KAPALI";
                    component.detectCollisions = true;
                }
            }
            
            // GodMode butonu
            if (GUI.Button(new Rect(10f, 90f, 250f, 30f), Ferlipse.GodModeLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.GodModeActive = !Ferlipse.GodModeActive;
                CharacterStats component2 = T17NetView.Find<Player>(2974).gameObject.GetComponent<CharacterStats>();
                if (Ferlipse.GodModeActive)
                {
                    Ferlipse.GodModeLabel = "GodMode AÇIK";
                    component2.GetType().GetField("m_bInfinitePlayerEnergyOn", Ferlipse.fieldBindingFlags).SetValue(component2, true);
                    component2.GetType().GetField("m_bInfinitePlayerHealthOn", Ferlipse.fieldBindingFlags).SetValue(component2, true);
                }
                else
                {
                    Ferlipse.GodModeLabel = "GodMode KAPALI";
                    component2.GetType().GetField("m_bInfinitePlayerEnergyOn", Ferlipse.fieldBindingFlags).SetValue(component2, false);
                    component2.GetType().GetField("m_bInfinitePlayerHealthOn", Ferlipse.fieldBindingFlags).SetValue(component2, false);
                }
            }
            
            // SpeedHack butonu
            if (GUI.Button(new Rect(10f, 130f, 250f, 30f), Ferlipse.SpeedHackLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.SpeedHackActive = !Ferlipse.SpeedHackActive;
                CharacterMovement component3 = T17NetView.Find<Player>(2974).gameObject.GetComponent<CharacterMovement>();
                if (Ferlipse.SpeedHackActive)
                {
                    Ferlipse.SpeedHackLabel = "SpeedHack AÇIK";
                    component3.m_fMaxSpeed = 15f;
                }
                else
                {
                    Ferlipse.SpeedHackLabel = "SpeedHack KAPALI";
                    component3.m_fMaxSpeed = 4.7f;
                }
            }
            
            // Tüm Kapıları Aç butonu
            if (GUI.Button(new Rect(10f, 170f, 250f, 30f), Ferlipse.UnlockDoorsLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.UnlockDoorsLabel = "Tüm Kapıları Açın";
                foreach (Door door in UnityEngine.Object.FindObjectsOfType<Door>())
                {
                    T17NetView.Find<Player>(2974).AddAllowedDoor(door, null);
                    door.SetForceOpen(true);
                    DoorManager.GetInstance().SetUpCharacterKeys(T17NetView.Find<Player>(2974));
                }
            }
            
            // Lockdown butonu
            if (GUI.Button(new Rect(10f, 210f, 250f, 30f), Ferlipse.LockdownLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.LockdownActive = !Ferlipse.LockdownActive;
                PrisonAlertnessManager instance = PrisonAlertnessManager.GetInstance();
                if (instance != null)
                {
                    if (Ferlipse.LockdownActive)
                    {
                        try
                        {
                            SolitaryManager.GetInstance().TriggerLockdown(false);
                            Debug.LogWarning("[Trainer] Kilitlemeyi Etkin olarak değiştirin: " + instance.GetCurrentAlertness().ToString());
                        }
                        catch (Exception ex)
                        {
                            Debug.LogError("[Trainer] Kilitleme HATASI: " + ex.Message);
                        }
                    }
                    try
                    {
                        SolitaryManager.GetInstance().GetType().GetMethod("OnAlarm_LockdownEnd", Ferlipse.defaultBindingFlags).Invoke(SolitaryManager.GetInstance(), null);
                        SolitaryManager.GetInstance().GetType().GetField("m_bIsLockdownActive", Ferlipse.fieldBindingFlags).SetValue(SolitaryManager.GetInstance(), false);
                        SolitaryManager.GetInstance().GetType().GetField("m_LockdownTimer", Ferlipse.fieldBindingFlags).SetValue(SolitaryManager.GetInstance(), null);
                        instance.StopCoroutine("HUD.Routine.Lockdown");
                        Debug.LogWarning("[Trainer] Kilitlemeyi Etkin Değil olarak değiştirin: " + instance.GetCurrentAlertness().ToString());
                    }
                    catch (Exception ex2)
                    {
                        Debug.LogError("[Trainer] Kilitleme HATASI: " + ex2.Message);
                    }
                }
            }
            
            // Köpekleri Devre Dışı Bırak butonu
            if (GUI.Button(new Rect(270f, 50f, 250f, 30f), Ferlipse.DogLabel, Ferlipse.buttonStyle))
            {
                DogEventManager dogEventManager = UnityEngine.Object.FindObjectOfType<DogEventManager>();
                if (dogEventManager != null)
                {
                    foreach (AICharacter aicharacter in NPCManager.GetInstance().m_Doggies)
                    {
                        AICharacter_Dog aicharacter_Dog = (AICharacter_Dog)aicharacter;
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetAttackingAIEvent());
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetBoundAIEvent());
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetKnockedOutAIEvent());
                        aicharacter_Dog.m_Character.SetIsAttacking(false);
                        aicharacter_Dog.m_Character.PauseMovement(1000f, true);
                        aicharacter_Dog.m_Character.m_CharacterOpinions.IncreaseOpinionOf(T17NetView.Find<Player>(2974), 1000);
                    }
                    dogEventManager.IsAttacking(false);
                    dogEventManager.IsBound(false, T17NetView.Find<Player>(2974));
                    Debug.Log("[Trainer] Köpekleri Çağırın");
                }
            }
            
            // Vurulabilir Köpekler butonu
            if (GUI.Button(new Rect(270f, 90f, 250f, 30f), Ferlipse.HittableDogsLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.HittableDogsActive = !Ferlipse.HittableDogsActive;
                UnityEngine.Object.FindObjectOfType<DogEventManager>();
                if (Ferlipse.HittableDogsActive)
                {
                    Ferlipse.HittableDogsLabel = "Vurulabilir Köpekler AÇIK";
                    foreach (AICharacter aicharacter2 in NPCManager.GetInstance().m_Doggies)
                    {
                        aicharacter2.m_Character.SetIsHittable(true);
                    }
                }
                else
                {
                    Ferlipse.HittableDogsLabel = "Vurulabilir Köpekler KAPALI";
                    foreach (AICharacter aicharacter3 in NPCManager.GetInstance().m_Doggies)
                    {
                        aicharacter3.m_Character.SetIsHittable(false);
                    }
                }
            }
            
            // Alanı bitirir
            GUILayout.EndArea();
        }
    }
}

  1. Menü ve Butonlar için GUI Stilleri Oluşturma:
    • GUI stilleri (GUIStyle) tanımlanarak menünün görünümü özelleştiriliyor. guistyle ile menü kutusunun stil ayarları yapılıyor. buttonStyle ile butonların stili ve labelStyle ile etiketlerin stili belirleniyor.
  2. Menü Alanı Başlatma:
    • GUILayout.BeginArea kullanılarak belirli bir dikdörtgen alanda menü başlatılıyor. Bu alanın koordinatları ve boyutları Rect ile belirleniyor.
  3. Etiketler ve Butonlar:
    • Menü başlığı bir etiket olarak ekleniyor (GUI.Label).
    • Her bir buton (GUI.Button) için farklı özellikler belirlenmiş:
      • Noclip Butonu: Karakterin çarpışma algılamasını açıp kapatır.
      • GodMode Butonu: Karakterin sağlık ve enerji durumunu sınırsız yapar.
      • SpeedHack Butonu: Karakterin hızını arttırır veya varsayılan hızına geri döndürür.
      • Tüm Kapıları Aç Butonu: Oyundaki tüm kapıları açar.
      • Lockdown Butonu: Oyunda kilitlemeyi etkinleştirir veya devre dışı bırakır.
      • Köpekleri Devre Dışı Bırak Butonu: Oyundaki köpeklerin saldırgan davranışlarını durdurur.
      • Vurulabilir Köpekler Butonu: Köpeklerin vurulabilir olup olmadığını değiştirir.
  4. Menü Alanını Bitirme:
    • GUILayout.EndArea kullanılarak menü alanı kapatılıyor.

C#:
// Token: 0x040070FE RID: 28926
public static string MenuLabel;

// Token: 0x040070FF RID: 28927
public static bool MenuVisible;

// Token: 0x04007100 RID: 28928
public static string MaxPlayerStatsLabel;

// Token: 0x04007101 RID: 28929
public static bool NoclipActive;

// Token: 0x04007102 RID: 28930
public static string NoclipLabel;

// Token: 0x04007103 RID: 28931
public static bool SpeedHackActive;

// Token: 0x04007104 RID: 28932
public static string SpeedHackLabel;

// Token: 0x04007105 RID: 28933
public static string UnlockDoorsLabel;

// Token: 0x04007106 RID: 28934
public static string LockdownLabel;

// Token: 0x04007107 RID: 28935
public static bool LockdownActive;

// Token: 0x04007108 RID: 28936
public static BindingFlags defaultBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

// Token: 0x04007109 RID: 28937
public static BindingFlags fieldBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField;

// Token: 0x0400710A RID: 28938
public static BindingFlags propertyBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty;

// Token: 0x0400710B RID: 28939
public static string DogLabel;

// Token: 0x0400710C RID: 28940
public static string HittableDogsLabel;

// Token: 0x0400710D RID: 28941
public static bool HittableDogsActive;

// Token: 0x0400710E RID: 28942
public static string GiveLabel;

// Token: 0x0400710F RID: 28943
public static bool GaveItem;

// Token: 0x04007110 RID: 28944
public static string GiveStaffKeyLabel;

// Token: 0x04007111 RID: 28945
public static string ElectricFencesLabel;

// Token: 0x04007112 RID: 28946
public static bool ElectricFencesActive;

// Token: 0x04007113 RID: 28947
public static int Test;

// Token: 0x04007114 RID: 28948
public static bool GodModeActive;

// Token: 0x04007115 RID: 28949
public static string GodModeLabel;

// Token: 0x04007116 RID: 28950
private static GUIStyle titleStyle;

// Token: 0x04007117 RID: 28951
private static GUIStyle buttonStyle;

// Token: 0x04007118 RID: 28952
private static GUIStyle labelStyle;

// Token: 0x04007119 RID: 28953
private static Texture2D buttonTexture;

// Token: 0x0400711A RID: 28954
private static bool menuVisible;



ss3.png


Menümüzün çalışması için gerekli olan fonksiyonu bulmamız ve ardından bu fonksiyona menü çizim kodunu eklememiz gerektiğini anlatıyor. OnGUI fonksiyonu, Unity'de GUI öğelerini çizmek için kullanılan bir fonksiyondur ve ekran her yenilendiğinde (frame) çağrılır. Bu yüzden, menümüzün sürekli olarak ekranda görünmesi için OnGUI fonksiyonunu kullanmalıyız.

Uygulama Adımları:

  1. OnGUI Fonksiyonunu Bulmak:
    • Unity'de arama kısmına OnGUI yazarak mevcut bir OnGUI fonksiyonunu bulabilirsiniz.
    • Eğer mevcut değilse, kendiniz oluşturabilirsiniz.
  2. Menü Çizim Kodunu Eklemek:
    • OnGUI fonksiyonunu bulduktan sonra, bu fonksiyona FerlipseMenu.Ferlipse.DrawMenu(); kodunu ekleyin.

Son olarak üst kısımdan hepsini kaydet butonuna tıklıyoruz, bizden dosya adı isteyecektir. Burada ilk başta seçtiğimiz Assembly-CSharp.dll dosyasını seçiyor ve Tamam'a tıklıyoruz. Bundan sonra ise artık oyunumuza gire biliriz.



Github Proje: github.com/DxeiZ/Ferlipse
Github Profilim: github.com/DxeiZ
 
ferlipse-wallpaper.png


Ferlipse ile The Escapists 2'de Sınırları Zorla: Kaçışın Yeni Şifresi!

The Escapists 2'de özgürlüğünüze giden yolu daha eğlenceli ve yaratıcı hale getirmek için geliştirdiğim Ferlipse'i sunacağım. Bu özel hile menüsü, oyunun sunduğu zorlukları aşarken size yeni stratejiler ve imkanlar tanıyacak. Artık hapishane yaşamının sınırlarını zorlayarak, kaçış planlarınızı daha heyecan verici hale getirebilirsiniz. Bu rehberde, Ferlipse'in yapım sürecini ve kodlama aşamalarını adım adım anlatacağım. Tek başıma geliştirdiğim bu hile menüsünün her bir detayını sizinle paylaşarak, benzer projeleri nasıl hayata geçirebileceğinizi göstereceğim.
  1. Ferlipse'in temel özellikleri ve sunduğu imkanlar.
  2. Ferlipse'in kodlama sürecinin detayları.



ss.png


Ferlipse'in temel özellikleri ve sunduğu imkanlar
Ferlipse size oyunda daha rahat ve özgürce dolaşmanıza olanak tanır.
  1. Noclip AÇIK: Duvarların içinden geçme özelliğini aktifleştirir.
  2. GodMode AÇIK: Oyuncuyu ölümsüz hale getirir, hiçbir hasar alınmaz.
  3. SpeedHack AÇIK: Oyuncunun hareket hızını artırır.
  4. Tüm Kapıları Aç: Haritadaki tüm kapıları anında açar.
  5. Lockdown OFF: Hapishane kilitlenmesini devre dışı bırakır.
  6. Köpekleri Devre Dışı Bırak: Köpekler oyundan çıkarılır.
  7. Vurulabilir Köpekler KAPALI: Köpeklere zarar verilmesini devre dışı bırakır.
  8. Elektrikli Çitler: Elektrikli çitlerin etkinliğini yönetir.
  9. Tüm Kapıların Kilidini Açın: Tüm kapıların kilidini açar.
  10. Tüm NPC'ler Vurulabilir: NPC'lerin vurulabilir hale gelmesini sağlar.
  11. Maksimum Oyuncu İstatistikleri: Oyuncunun tüm istatistiklerini maksimum seviyeye çıkarır.



Ferlipse'in kodlama sürecinin detayları

Proje ilk başta polislerin yerlerini kutu içinde gösteren ve hangi sandıkta hangi eşyaların bulunduğunu yazan bir menü oluşturma amacı taşıyordu. İlk olarak, oyuncular için kolaylık sağlamak amacıyla bir API veya SDK kullanmayı planladım. Ancak, araştırmalarım sonucunda bu ikisinin de resmi olarak mevcut olmadığını gördüm.

Bu nedenle farklı bir yol izlemeye karar verdim ve oyunun dosyalarını incelemeye başladım. İncelemelerim sırasında genellikle oyunun yönetim klasörüne rastladım. Burada, Assembly-CSharp.dll dosyasını buldum. Sonraki adım, bu Assembly kodlarını düzenleyecek bir araç bulmak ve kullanmaktı. Bunun için dnSPY'i seçtim.




Şimdi, Ferlipse'in temel işlevlerini nasıl kodladığımı adım adım açıklayacağım:

İlk olarak dnSPY da klasörümüzü açmamız gerekiyor bunun için Dosya › Aç (Ctrl+O) tıklıyor, oyumuzun olduğu klasöre geliyor ve örnek bu yolu takip ediyoruz: C:\Program Files (x86)\Steam\steamapps\common\The Escapists 2\TheEscapists2_Data\Managed/Assembly-CSharp.dll


ss2.png
Ardından dosyaya sağ tıklıyor, Tür oluştur diyoruz ve isimlendirmelerimizi yapıyoruz. Tamam'a tıklıyor ve kodlama kısmına geçiş yapıyoruz.


C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
C#:
namespace FerlipseMenu
{
    // Ferlipse adında bir sınıf tanımlanıyor, bu sınıf MonoBehaviour'dan türetiliyor
    public class Ferlipse : MonoBehaviour
    {
        // Menü çizim fonksiyonu
        public static void DrawMenu()
        {
            // Menü ve butonlar için GUI stilleri oluşturuluyor
            GUIStyle guistyle = new GUIStyle(GUI.skin.box);
            guistyle.padding = new RectOffset(10, 10, 10, 10);
            guistyle.margin = new RectOffset(10, 10, 10, 10);
            guistyle.normal.background = Ferlipse.MakeTexture(2, 2, new Color(0.114f, 0.118f, 0.153f));
            Ferlipse.buttonStyle = new GUIStyle(GUI.skin.button);
            Ferlipse.buttonStyle.fontSize = 14;
            Ferlipse.buttonStyle.alignment = TextAnchor.MiddleCenter;
            Ferlipse.buttonStyle.normal.textColor = new Color(0.929f, 0.949f, 0.957f);
            Ferlipse.buttonStyle.normal.background = Ferlipse.MakeTexture(2, 2, new Color(1f, 0f, 0f));
            Ferlipse.buttonStyle.hover.background = Ferlipse.MakeTexture(2, 2, new Color(0.8f, 0f, 0f));
            Ferlipse.labelStyle = new GUIStyle();
            Ferlipse.labelStyle.fontSize = 15;
            Ferlipse.labelStyle.alignment = TextAnchor.MiddleCenter;
            Ferlipse.labelStyle.normal.textColor = new Color(0.784f, 0f, 0.094f);
           
            // Menü alanının başlaması
            GUILayout.BeginArea(new Rect(0f, 0f, 540f, 300f), guistyle);
            GUI.Label(new Rect(10f, 10f, 510f, 30f), Ferlipse.MenuLabel, Ferlipse.labelStyle);
           
            // Noclip butonu
            if (GUI.Button(new Rect(10f, 50f, 250f, 30f), Ferlipse.NoclipLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.NoclipActive = !Ferlipse.NoclipActive;
                Rigidbody component = T17NetView.Find<Player>(2974).gameObject.GetComponent<Rigidbody>();
                if (Ferlipse.NoclipActive)
                {
                    Ferlipse.NoclipLabel = "Noclip AÇIK";
                    component.detectCollisions = false;
                }
                else
                {
                    Ferlipse.NoclipLabel = "Noclip KAPALI";
                    component.detectCollisions = true;
                }
            }
           
            // GodMode butonu
            if (GUI.Button(new Rect(10f, 90f, 250f, 30f), Ferlipse.GodModeLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.GodModeActive = !Ferlipse.GodModeActive;
                CharacterStats component2 = T17NetView.Find<Player>(2974).gameObject.GetComponent<CharacterStats>();
                if (Ferlipse.GodModeActive)
                {
                    Ferlipse.GodModeLabel = "GodMode AÇIK";
                    component2.GetType().GetField("m_bInfinitePlayerEnergyOn", Ferlipse.fieldBindingFlags).SetValue(component2, true);
                    component2.GetType().GetField("m_bInfinitePlayerHealthOn", Ferlipse.fieldBindingFlags).SetValue(component2, true);
                }
                else
                {
                    Ferlipse.GodModeLabel = "GodMode KAPALI";
                    component2.GetType().GetField("m_bInfinitePlayerEnergyOn", Ferlipse.fieldBindingFlags).SetValue(component2, false);
                    component2.GetType().GetField("m_bInfinitePlayerHealthOn", Ferlipse.fieldBindingFlags).SetValue(component2, false);
                }
            }
           
            // SpeedHack butonu
            if (GUI.Button(new Rect(10f, 130f, 250f, 30f), Ferlipse.SpeedHackLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.SpeedHackActive = !Ferlipse.SpeedHackActive;
                CharacterMovement component3 = T17NetView.Find<Player>(2974).gameObject.GetComponent<CharacterMovement>();
                if (Ferlipse.SpeedHackActive)
                {
                    Ferlipse.SpeedHackLabel = "SpeedHack AÇIK";
                    component3.m_fMaxSpeed = 15f;
                }
                else
                {
                    Ferlipse.SpeedHackLabel = "SpeedHack KAPALI";
                    component3.m_fMaxSpeed = 4.7f;
                }
            }
           
            // Tüm Kapıları Aç butonu
            if (GUI.Button(new Rect(10f, 170f, 250f, 30f), Ferlipse.UnlockDoorsLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.UnlockDoorsLabel = "Tüm Kapıları Açın";
                foreach (Door door in UnityEngine.Object.FindObjectsOfType<Door>())
                {
                    T17NetView.Find<Player>(2974).AddAllowedDoor(door, null);
                    door.SetForceOpen(true);
                    DoorManager.GetInstance().SetUpCharacterKeys(T17NetView.Find<Player>(2974));
                }
            }
           
            // Lockdown butonu
            if (GUI.Button(new Rect(10f, 210f, 250f, 30f), Ferlipse.LockdownLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.LockdownActive = !Ferlipse.LockdownActive;
                PrisonAlertnessManager instance = PrisonAlertnessManager.GetInstance();
                if (instance != null)
                {
                    if (Ferlipse.LockdownActive)
                    {
                        try
                        {
                            SolitaryManager.GetInstance().TriggerLockdown(false);
                            Debug.LogWarning("[Trainer] Kilitlemeyi Etkin olarak değiştirin: " + instance.GetCurrentAlertness().ToString());
                        }
                        catch (Exception ex)
                        {
                            Debug.LogError("[Trainer] Kilitleme HATASI: " + ex.Message);
                        }
                    }
                    try
                    {
                        SolitaryManager.GetInstance().GetType().GetMethod("OnAlarm_LockdownEnd", Ferlipse.defaultBindingFlags).Invoke(SolitaryManager.GetInstance(), null);
                        SolitaryManager.GetInstance().GetType().GetField("m_bIsLockdownActive", Ferlipse.fieldBindingFlags).SetValue(SolitaryManager.GetInstance(), false);
                        SolitaryManager.GetInstance().GetType().GetField("m_LockdownTimer", Ferlipse.fieldBindingFlags).SetValue(SolitaryManager.GetInstance(), null);
                        instance.StopCoroutine("HUD.Routine.Lockdown");
                        Debug.LogWarning("[Trainer] Kilitlemeyi Etkin Değil olarak değiştirin: " + instance.GetCurrentAlertness().ToString());
                    }
                    catch (Exception ex2)
                    {
                        Debug.LogError("[Trainer] Kilitleme HATASI: " + ex2.Message);
                    }
                }
            }
           
            // Köpekleri Devre Dışı Bırak butonu
            if (GUI.Button(new Rect(270f, 50f, 250f, 30f), Ferlipse.DogLabel, Ferlipse.buttonStyle))
            {
                DogEventManager dogEventManager = UnityEngine.Object.FindObjectOfType<DogEventManager>();
                if (dogEventManager != null)
                {
                    foreach (AICharacter aicharacter in NPCManager.GetInstance().m_Doggies)
                    {
                        AICharacter_Dog aicharacter_Dog = (AICharacter_Dog)aicharacter;
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetAttackingAIEvent());
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetBoundAIEvent());
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetKnockedOutAIEvent());
                        aicharacter_Dog.m_Character.SetIsAttacking(false);
                        aicharacter_Dog.m_Character.PauseMovement(1000f, true);
                        aicharacter_Dog.m_Character.m_CharacterOpinions.IncreaseOpinionOf(T17NetView.Find<Player>(2974), 1000);
                    }
                    dogEventManager.IsAttacking(false);
                    dogEventManager.IsBound(false, T17NetView.Find<Player>(2974));
                    Debug.Log("[Trainer] Köpekleri Çağırın");
                }
            }
           
            // Vurulabilir Köpekler butonu
            if (GUI.Button(new Rect(270f, 90f, 250f, 30f), Ferlipse.HittableDogsLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.HittableDogsActive = !Ferlipse.HittableDogsActive;
                UnityEngine.Object.FindObjectOfType<DogEventManager>();
                if (Ferlipse.HittableDogsActive)
                {
                    Ferlipse.HittableDogsLabel = "Vurulabilir Köpekler AÇIK";
                    foreach (AICharacter aicharacter2 in NPCManager.GetInstance().m_Doggies)
                    {
                        aicharacter2.m_Character.SetIsHittable(true);
                    }
                }
                else
                {
                    Ferlipse.HittableDogsLabel = "Vurulabilir Köpekler KAPALI";
                    foreach (AICharacter aicharacter3 in NPCManager.GetInstance().m_Doggies)
                    {
                        aicharacter3.m_Character.SetIsHittable(false);
                    }
                }
            }
           
            // Alanı bitirir
            GUILayout.EndArea();
        }
    }
}

  1. Menü ve Butonlar için GUI Stilleri Oluşturma:
    • GUI stilleri (GUIStyle) tanımlanarak menünün görünümü özelleştiriliyor. guistyle ile menü kutusunun stil ayarları yapılıyor. buttonStyle ile butonların stili ve labelStyle ile etiketlerin stili belirleniyor.
  2. Menü Alanı Başlatma:
    • GUILayout.BeginArea kullanılarak belirli bir dikdörtgen alanda menü başlatılıyor. Bu alanın koordinatları ve boyutları Rect ile belirleniyor.
  3. Etiketler ve Butonlar:
    • Menü başlığı bir etiket olarak ekleniyor (GUI.Label).
    • Her bir buton (GUI.Button) için farklı özellikler belirlenmiş:
      • Noclip Butonu: Karakterin çarpışma algılamasını açıp kapatır.
      • GodMode Butonu: Karakterin sağlık ve enerji durumunu sınırsız yapar.
      • SpeedHack Butonu: Karakterin hızını arttırır veya varsayılan hızına geri döndürür.
      • Tüm Kapıları Aç Butonu: Oyundaki tüm kapıları açar.
      • Lockdown Butonu: Oyunda kilitlemeyi etkinleştirir veya devre dışı bırakır.
      • Köpekleri Devre Dışı Bırak Butonu: Oyundaki köpeklerin saldırgan davranışlarını durdurur.
      • Vurulabilir Köpekler Butonu: Köpeklerin vurulabilir olup olmadığını değiştirir.
  4. Menü Alanını Bitirme:
    • GUILayout.EndArea kullanılarak menü alanı kapatılıyor.

C#:
// Token: 0x040070FE RID: 28926
public static string MenuLabel;

// Token: 0x040070FF RID: 28927
public static bool MenuVisible;

// Token: 0x04007100 RID: 28928
public static string MaxPlayerStatsLabel;

// Token: 0x04007101 RID: 28929
public static bool NoclipActive;

// Token: 0x04007102 RID: 28930
public static string NoclipLabel;

// Token: 0x04007103 RID: 28931
public static bool SpeedHackActive;

// Token: 0x04007104 RID: 28932
public static string SpeedHackLabel;

// Token: 0x04007105 RID: 28933
public static string UnlockDoorsLabel;

// Token: 0x04007106 RID: 28934
public static string LockdownLabel;

// Token: 0x04007107 RID: 28935
public static bool LockdownActive;

// Token: 0x04007108 RID: 28936
public static BindingFlags defaultBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

// Token: 0x04007109 RID: 28937
public static BindingFlags fieldBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField;

// Token: 0x0400710A RID: 28938
public static BindingFlags propertyBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty;

// Token: 0x0400710B RID: 28939
public static string DogLabel;

// Token: 0x0400710C RID: 28940
public static string HittableDogsLabel;

// Token: 0x0400710D RID: 28941
public static bool HittableDogsActive;

// Token: 0x0400710E RID: 28942
public static string GiveLabel;

// Token: 0x0400710F RID: 28943
public static bool GaveItem;

// Token: 0x04007110 RID: 28944
public static string GiveStaffKeyLabel;

// Token: 0x04007111 RID: 28945
public static string ElectricFencesLabel;

// Token: 0x04007112 RID: 28946
public static bool ElectricFencesActive;

// Token: 0x04007113 RID: 28947
public static int Test;

// Token: 0x04007114 RID: 28948
public static bool GodModeActive;

// Token: 0x04007115 RID: 28949
public static string GodModeLabel;

// Token: 0x04007116 RID: 28950
private static GUIStyle titleStyle;

// Token: 0x04007117 RID: 28951
private static GUIStyle buttonStyle;

// Token: 0x04007118 RID: 28952
private static GUIStyle labelStyle;

// Token: 0x04007119 RID: 28953
private static Texture2D buttonTexture;

// Token: 0x0400711A RID: 28954
private static bool menuVisible;



ss3.png


Menümüzün çalışması için gerekli olan fonksiyonu bulmamız ve ardından bu fonksiyona menü çizim kodunu eklememiz gerektiğini anlatıyor. OnGUI fonksiyonu, Unity'de GUI öğelerini çizmek için kullanılan bir fonksiyondur ve ekran her yenilendiğinde (frame) çağrılır. Bu yüzden, menümüzün sürekli olarak ekranda görünmesi için OnGUI fonksiyonunu kullanmalıyız.

Uygulama Adımları:

  1. OnGUI Fonksiyonunu Bulmak:
    • Unity'de arama kısmına OnGUI yazarak mevcut bir OnGUI fonksiyonunu bulabilirsiniz.
    • Eğer mevcut değilse, kendiniz oluşturabilirsiniz.
  2. Menü Çizim Kodunu Eklemek:
    • OnGUI fonksiyonunu bulduktan sonra, bu fonksiyona FerlipseMenu.Ferlipse.DrawMenu(); kodunu ekleyin.

Son olarak üst kısımdan hepsini kaydet butonuna tıklıyoruz, bizden dosya adı isteyecektir. Burada ilk başta seçtiğimiz Assembly-CSharp.dll dosyasını seçiyor ve Tamam'a tıklıyoruz. Bundan sonra ise artık oyunumuza gire biliriz.



Github Proje: github.com/DxeiZ/Ferlipse
Github Profilim: github.com/DxeiZ
Ellerine sağlık.
 
ferlipse-wallpaper.png


Ferlipse ile The Escapists 2'de Sınırları Zorla: Kaçışın Yeni Şifresi!

The Escapists 2'de özgürlüğünüze giden yolu daha eğlenceli ve yaratıcı hale getirmek için geliştirdiğim Ferlipse'i sunacağım. Bu özel hile menüsü, oyunun sunduğu zorlukları aşarken size yeni stratejiler ve imkanlar tanıyacak. Artık hapishane yaşamının sınırlarını zorlayarak, kaçış planlarınızı daha heyecan verici hale getirebilirsiniz. Bu rehberde, Ferlipse'in yapım sürecini ve kodlama aşamalarını adım adım anlatacağım. Tek başıma geliştirdiğim bu hile menüsünün her bir detayını sizinle paylaşarak, benzer projeleri nasıl hayata geçirebileceğinizi göstereceğim.
  1. Ferlipse'in temel özellikleri ve sunduğu imkanlar.
  2. Ferlipse'in kodlama sürecinin detayları.



ss.png


Ferlipse'in temel özellikleri ve sunduğu imkanlar
Ferlipse size oyunda daha rahat ve özgürce dolaşmanıza olanak tanır.
  1. Noclip AÇIK: Duvarların içinden geçme özelliğini aktifleştirir.
  2. GodMode AÇIK: Oyuncuyu ölümsüz hale getirir, hiçbir hasar alınmaz.
  3. SpeedHack AÇIK: Oyuncunun hareket hızını artırır.
  4. Tüm Kapıları Aç: Haritadaki tüm kapıları anında açar.
  5. Lockdown OFF: Hapishane kilitlenmesini devre dışı bırakır.
  6. Köpekleri Devre Dışı Bırak: Köpekler oyundan çıkarılır.
  7. Vurulabilir Köpekler KAPALI: Köpeklere zarar verilmesini devre dışı bırakır.
  8. Elektrikli Çitler: Elektrikli çitlerin etkinliğini yönetir.
  9. Tüm Kapıların Kilidini Açın: Tüm kapıların kilidini açar.
  10. Tüm NPC'ler Vurulabilir: NPC'lerin vurulabilir hale gelmesini sağlar.
  11. Maksimum Oyuncu İstatistikleri: Oyuncunun tüm istatistiklerini maksimum seviyeye çıkarır.



Ferlipse'in kodlama sürecinin detayları

Proje ilk başta polislerin yerlerini kutu içinde gösteren ve hangi sandıkta hangi eşyaların bulunduğunu yazan bir menü oluşturma amacı taşıyordu. İlk olarak, oyuncular için kolaylık sağlamak amacıyla bir API veya SDK kullanmayı planladım. Ancak, araştırmalarım sonucunda bu ikisinin de resmi olarak mevcut olmadığını gördüm.

Bu nedenle farklı bir yol izlemeye karar verdim ve oyunun dosyalarını incelemeye başladım. İncelemelerim sırasında genellikle oyunun yönetim klasörüne rastladım. Burada, Assembly-CSharp.dll dosyasını buldum. Sonraki adım, bu Assembly kodlarını düzenleyecek bir araç bulmak ve kullanmaktı. Bunun için dnSPY'i seçtim.




Şimdi, Ferlipse'in temel işlevlerini nasıl kodladığımı adım adım açıklayacağım:

İlk olarak dnSPY da klasörümüzü açmamız gerekiyor bunun için Dosya › Aç (Ctrl+O) tıklıyor, oyumuzun olduğu klasöre geliyor ve örnek bu yolu takip ediyoruz: C:\Program Files (x86)\Steam\steamapps\common\The Escapists 2\TheEscapists2_Data\Managed/Assembly-CSharp.dll


ss2.png
Ardından dosyaya sağ tıklıyor, Tür oluştur diyoruz ve isimlendirmelerimizi yapıyoruz. Tamam'a tıklıyor ve kodlama kısmına geçiş yapıyoruz.


C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
C#:
namespace FerlipseMenu
{
    // Ferlipse adında bir sınıf tanımlanıyor, bu sınıf MonoBehaviour'dan türetiliyor
    public class Ferlipse : MonoBehaviour
    {
        // Menü çizim fonksiyonu
        public static void DrawMenu()
        {
            // Menü ve butonlar için GUI stilleri oluşturuluyor
            GUIStyle guistyle = new GUIStyle(GUI.skin.box);
            guistyle.padding = new RectOffset(10, 10, 10, 10);
            guistyle.margin = new RectOffset(10, 10, 10, 10);
            guistyle.normal.background = Ferlipse.MakeTexture(2, 2, new Color(0.114f, 0.118f, 0.153f));
            Ferlipse.buttonStyle = new GUIStyle(GUI.skin.button);
            Ferlipse.buttonStyle.fontSize = 14;
            Ferlipse.buttonStyle.alignment = TextAnchor.MiddleCenter;
            Ferlipse.buttonStyle.normal.textColor = new Color(0.929f, 0.949f, 0.957f);
            Ferlipse.buttonStyle.normal.background = Ferlipse.MakeTexture(2, 2, new Color(1f, 0f, 0f));
            Ferlipse.buttonStyle.hover.background = Ferlipse.MakeTexture(2, 2, new Color(0.8f, 0f, 0f));
            Ferlipse.labelStyle = new GUIStyle();
            Ferlipse.labelStyle.fontSize = 15;
            Ferlipse.labelStyle.alignment = TextAnchor.MiddleCenter;
            Ferlipse.labelStyle.normal.textColor = new Color(0.784f, 0f, 0.094f);
            
            // Menü alanının başlaması
            GUILayout.BeginArea(new Rect(0f, 0f, 540f, 300f), guistyle);
            GUI.Label(new Rect(10f, 10f, 510f, 30f), Ferlipse.MenuLabel, Ferlipse.labelStyle);
            
            // Noclip butonu
            if (GUI.Button(new Rect(10f, 50f, 250f, 30f), Ferlipse.NoclipLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.NoclipActive = !Ferlipse.NoclipActive;
                Rigidbody component = T17NetView.Find<Player>(2974).gameObject.GetComponent<Rigidbody>();
                if (Ferlipse.NoclipActive)
                {
                    Ferlipse.NoclipLabel = "Noclip AÇIK";
                    component.detectCollisions = false;
                }
                else
                {
                    Ferlipse.NoclipLabel = "Noclip KAPALI";
                    component.detectCollisions = true;
                }
            }
            
            // GodMode butonu
            if (GUI.Button(new Rect(10f, 90f, 250f, 30f), Ferlipse.GodModeLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.GodModeActive = !Ferlipse.GodModeActive;
                CharacterStats component2 = T17NetView.Find<Player>(2974).gameObject.GetComponent<CharacterStats>();
                if (Ferlipse.GodModeActive)
                {
                    Ferlipse.GodModeLabel = "GodMode AÇIK";
                    component2.GetType().GetField("m_bInfinitePlayerEnergyOn", Ferlipse.fieldBindingFlags).SetValue(component2, true);
                    component2.GetType().GetField("m_bInfinitePlayerHealthOn", Ferlipse.fieldBindingFlags).SetValue(component2, true);
                }
                else
                {
                    Ferlipse.GodModeLabel = "GodMode KAPALI";
                    component2.GetType().GetField("m_bInfinitePlayerEnergyOn", Ferlipse.fieldBindingFlags).SetValue(component2, false);
                    component2.GetType().GetField("m_bInfinitePlayerHealthOn", Ferlipse.fieldBindingFlags).SetValue(component2, false);
                }
            }
            
            // SpeedHack butonu
            if (GUI.Button(new Rect(10f, 130f, 250f, 30f), Ferlipse.SpeedHackLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.SpeedHackActive = !Ferlipse.SpeedHackActive;
                CharacterMovement component3 = T17NetView.Find<Player>(2974).gameObject.GetComponent<CharacterMovement>();
                if (Ferlipse.SpeedHackActive)
                {
                    Ferlipse.SpeedHackLabel = "SpeedHack AÇIK";
                    component3.m_fMaxSpeed = 15f;
                }
                else
                {
                    Ferlipse.SpeedHackLabel = "SpeedHack KAPALI";
                    component3.m_fMaxSpeed = 4.7f;
                }
            }
            
            // Tüm Kapıları Aç butonu
            if (GUI.Button(new Rect(10f, 170f, 250f, 30f), Ferlipse.UnlockDoorsLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.UnlockDoorsLabel = "Tüm Kapıları Açın";
                foreach (Door door in UnityEngine.Object.FindObjectsOfType<Door>())
                {
                    T17NetView.Find<Player>(2974).AddAllowedDoor(door, null);
                    door.SetForceOpen(true);
                    DoorManager.GetInstance().SetUpCharacterKeys(T17NetView.Find<Player>(2974));
                }
            }
            
            // Lockdown butonu
            if (GUI.Button(new Rect(10f, 210f, 250f, 30f), Ferlipse.LockdownLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.LockdownActive = !Ferlipse.LockdownActive;
                PrisonAlertnessManager instance = PrisonAlertnessManager.GetInstance();
                if (instance != null)
                {
                    if (Ferlipse.LockdownActive)
                    {
                        try
                        {
                            SolitaryManager.GetInstance().TriggerLockdown(false);
                            Debug.LogWarning("[Trainer] Kilitlemeyi Etkin olarak değiştirin: " + instance.GetCurrentAlertness().ToString());
                        }
                        catch (Exception ex)
                        {
                            Debug.LogError("[Trainer] Kilitleme HATASI: " + ex.Message);
                        }
                    }
                    try
                    {
                        SolitaryManager.GetInstance().GetType().GetMethod("OnAlarm_LockdownEnd", Ferlipse.defaultBindingFlags).Invoke(SolitaryManager.GetInstance(), null);
                        SolitaryManager.GetInstance().GetType().GetField("m_bIsLockdownActive", Ferlipse.fieldBindingFlags).SetValue(SolitaryManager.GetInstance(), false);
                        SolitaryManager.GetInstance().GetType().GetField("m_LockdownTimer", Ferlipse.fieldBindingFlags).SetValue(SolitaryManager.GetInstance(), null);
                        instance.StopCoroutine("HUD.Routine.Lockdown");
                        Debug.LogWarning("[Trainer] Kilitlemeyi Etkin Değil olarak değiştirin: " + instance.GetCurrentAlertness().ToString());
                    }
                    catch (Exception ex2)
                    {
                        Debug.LogError("[Trainer] Kilitleme HATASI: " + ex2.Message);
                    }
                }
            }
            
            // Köpekleri Devre Dışı Bırak butonu
            if (GUI.Button(new Rect(270f, 50f, 250f, 30f), Ferlipse.DogLabel, Ferlipse.buttonStyle))
            {
                DogEventManager dogEventManager = UnityEngine.Object.FindObjectOfType<DogEventManager>();
                if (dogEventManager != null)
                {
                    foreach (AICharacter aicharacter in NPCManager.GetInstance().m_Doggies)
                    {
                        AICharacter_Dog aicharacter_Dog = (AICharacter_Dog)aicharacter;
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetAttackingAIEvent());
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetBoundAIEvent());
                        aicharacter_Dog.ForgetEvent(dogEventManager.GetKnockedOutAIEvent());
                        aicharacter_Dog.m_Character.SetIsAttacking(false);
                        aicharacter_Dog.m_Character.PauseMovement(1000f, true);
                        aicharacter_Dog.m_Character.m_CharacterOpinions.IncreaseOpinionOf(T17NetView.Find<Player>(2974), 1000);
                    }
                    dogEventManager.IsAttacking(false);
                    dogEventManager.IsBound(false, T17NetView.Find<Player>(2974));
                    Debug.Log("[Trainer] Köpekleri Çağırın");
                }
            }
            
            // Vurulabilir Köpekler butonu
            if (GUI.Button(new Rect(270f, 90f, 250f, 30f), Ferlipse.HittableDogsLabel, Ferlipse.buttonStyle))
            {
                Ferlipse.HittableDogsActive = !Ferlipse.HittableDogsActive;
                UnityEngine.Object.FindObjectOfType<DogEventManager>();
                if (Ferlipse.HittableDogsActive)
                {
                    Ferlipse.HittableDogsLabel = "Vurulabilir Köpekler AÇIK";
                    foreach (AICharacter aicharacter2 in NPCManager.GetInstance().m_Doggies)
                    {
                        aicharacter2.m_Character.SetIsHittable(true);
                    }
                }
                else
                {
                    Ferlipse.HittableDogsLabel = "Vurulabilir Köpekler KAPALI";
                    foreach (AICharacter aicharacter3 in NPCManager.GetInstance().m_Doggies)
                    {
                        aicharacter3.m_Character.SetIsHittable(false);
                    }
                }
            }
            
            // Alanı bitirir
            GUILayout.EndArea();
        }
    }
}

  1. Menü ve Butonlar için GUI Stilleri Oluşturma:
    • GUI stilleri (GUIStyle) tanımlanarak menünün görünümü özelleştiriliyor. guistyle ile menü kutusunun stil ayarları yapılıyor. buttonStyle ile butonların stili ve labelStyle ile etiketlerin stili belirleniyor.
  2. Menü Alanı Başlatma:
    • GUILayout.BeginArea kullanılarak belirli bir dikdörtgen alanda menü başlatılıyor. Bu alanın koordinatları ve boyutları Rect ile belirleniyor.
  3. Etiketler ve Butonlar:
    • Menü başlığı bir etiket olarak ekleniyor (GUI.Label).
    • Her bir buton (GUI.Button) için farklı özellikler belirlenmiş:
      • Noclip Butonu: Karakterin çarpışma algılamasını açıp kapatır.
      • GodMode Butonu: Karakterin sağlık ve enerji durumunu sınırsız yapar.
      • SpeedHack Butonu: Karakterin hızını arttırır veya varsayılan hızına geri döndürür.
      • Tüm Kapıları Aç Butonu: Oyundaki tüm kapıları açar.
      • Lockdown Butonu: Oyunda kilitlemeyi etkinleştirir veya devre dışı bırakır.
      • Köpekleri Devre Dışı Bırak Butonu: Oyundaki köpeklerin saldırgan davranışlarını durdurur.
      • Vurulabilir Köpekler Butonu: Köpeklerin vurulabilir olup olmadığını değiştirir.
  4. Menü Alanını Bitirme:
    • GUILayout.EndArea kullanılarak menü alanı kapatılıyor.

C#:
// Token: 0x040070FE RID: 28926
public static string MenuLabel;

// Token: 0x040070FF RID: 28927
public static bool MenuVisible;

// Token: 0x04007100 RID: 28928
public static string MaxPlayerStatsLabel;

// Token: 0x04007101 RID: 28929
public static bool NoclipActive;

// Token: 0x04007102 RID: 28930
public static string NoclipLabel;

// Token: 0x04007103 RID: 28931
public static bool SpeedHackActive;

// Token: 0x04007104 RID: 28932
public static string SpeedHackLabel;

// Token: 0x04007105 RID: 28933
public static string UnlockDoorsLabel;

// Token: 0x04007106 RID: 28934
public static string LockdownLabel;

// Token: 0x04007107 RID: 28935
public static bool LockdownActive;

// Token: 0x04007108 RID: 28936
public static BindingFlags defaultBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

// Token: 0x04007109 RID: 28937
public static BindingFlags fieldBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField;

// Token: 0x0400710A RID: 28938
public static BindingFlags propertyBindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty;

// Token: 0x0400710B RID: 28939
public static string DogLabel;

// Token: 0x0400710C RID: 28940
public static string HittableDogsLabel;

// Token: 0x0400710D RID: 28941
public static bool HittableDogsActive;

// Token: 0x0400710E RID: 28942
public static string GiveLabel;

// Token: 0x0400710F RID: 28943
public static bool GaveItem;

// Token: 0x04007110 RID: 28944
public static string GiveStaffKeyLabel;

// Token: 0x04007111 RID: 28945
public static string ElectricFencesLabel;

// Token: 0x04007112 RID: 28946
public static bool ElectricFencesActive;

// Token: 0x04007113 RID: 28947
public static int Test;

// Token: 0x04007114 RID: 28948
public static bool GodModeActive;

// Token: 0x04007115 RID: 28949
public static string GodModeLabel;

// Token: 0x04007116 RID: 28950
private static GUIStyle titleStyle;

// Token: 0x04007117 RID: 28951
private static GUIStyle buttonStyle;

// Token: 0x04007118 RID: 28952
private static GUIStyle labelStyle;

// Token: 0x04007119 RID: 28953
private static Texture2D buttonTexture;

// Token: 0x0400711A RID: 28954
private static bool menuVisible;



ss3.png


Menümüzün çalışması için gerekli olan fonksiyonu bulmamız ve ardından bu fonksiyona menü çizim kodunu eklememiz gerektiğini anlatıyor. OnGUI fonksiyonu, Unity'de GUI öğelerini çizmek için kullanılan bir fonksiyondur ve ekran her yenilendiğinde (frame) çağrılır. Bu yüzden, menümüzün sürekli olarak ekranda görünmesi için OnGUI fonksiyonunu kullanmalıyız.

Uygulama Adımları:

  1. OnGUI Fonksiyonunu Bulmak:
    • Unity'de arama kısmına OnGUI yazarak mevcut bir OnGUI fonksiyonunu bulabilirsiniz.
    • Eğer mevcut değilse, kendiniz oluşturabilirsiniz.
  2. Menü Çizim Kodunu Eklemek:
    • OnGUI fonksiyonunu bulduktan sonra, bu fonksiyona FerlipseMenu.Ferlipse.DrawMenu(); kodunu ekleyin.

Son olarak üst kısımdan hepsini kaydet butonuna tıklıyoruz, bizden dosya adı isteyecektir. Burada ilk başta seçtiğimiz Assembly-CSharp.dll dosyasını seçiyor ve Tamam'a tıklıyoruz. Bundan sonra ise artık oyunumuza gire biliriz.



Github Proje: github.com/DxeiZ/Ferlipse
Github Profilim: github.com/DxeiZ
Emeğine sağlık
 

THT SON KONULAR

Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.