Putting the 'role' back in role-playing games since 2002.
Donate to Codex
Good Old Games
  • Welcome to rpgcodex.net, a site dedicated to discussing computer based role-playing games in a free and open fashion. We're less strict than other forums, but please refer to the rules.

    "This message is awaiting moderator approval": All new users must pass through our moderation queue before they will be able to post normally. Until your account has "passed" your posts will only be visible to yourself (and moderators) until they are approved. Give us a week to get around to approving / deleting / ignoring your mundane opinion on crap before hassling us about it. Once you have passed the moderation period (think of it as a test), you will be able to post normally, just like all the other retards.

Pillars of Eternity Coding/Hacking Thread

Sensuki

Arcane
Joined
Oct 26, 2012
Messages
9,800
Location
New North Korea
Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
Now I just need to figure out what the order of the bundle-inject command is
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
So. Last time I got stuck at trying to make the game use the modified assets. Figured the game automatically uses packaged assets instead, and Obs just exported the individual unity3d files (spells, items, etc) for modders for later use.

While this is true, there is actually already a way to make the game use those modified unity3d files. There is a console command that does it is: UseAssetBundles

Unfortunately, the game doesn't understand my modified version of the assets for some reason just yet. Working on it.
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
Ok, so I finally managed to import a very simple game asset into Unity, modify it (changed the price), and then reexport back into the game. It's a very basic item, but it's a start.

This method does require Unity Pro, though, no way around it. The reason for that is the functionality required to modify PoE items could also be used to make DLCs for Unity based games, which is why Unity decided to make it a Pro feature. This might considerably reduce the game's modding potential, unless Obs release some modding tools.

poe-modding-test.jpg

(this doesn't have anything to do with trolling, don't look for hidden meanings, I only noticed the item's name a bit too late)
 

Sensuki

Arcane
Joined
Oct 26, 2012
Messages
9,800
Location
New North Korea
Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
Can someone help me look for how to disable melee engagement altogether? I'll bet the gameplay would be a lot better without it because it makes melee combat an absolute clusterfuck.

edit: deleting the EngageEnemy method would probably do it.
 
Last edited:

Immortal

Arcane
In My Safe Space
Joined
Sep 13, 2014
Messages
5,062
Location
Safe Space - Don't Bulli
Can someone help me look for how to disable melee engagement altogether? I'll bet the gameplay would be a lot better without it because it makes melee combat an absolute clusterfuck.

edit: deleting the EngageEnemy method would probably do it.

You know you really shit the bed as a designer when a modding community is created solely for removing your crappy ideas from the game.
 

Sensuki

Arcane
Joined
Oct 26, 2012
Messages
9,800
Location
New North Korea
Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
Obsidian have also removed the additem function in this build. Probably my fault as I've been summoning items and revealing that Character Art is in a lot worse state than we expected / summoning cool looking items and posting them on the forums. I save every dll file from every build, so would someone be able to help me look for the code that restores the additem function ?

Code might be in the CommandLine class ... possibly the Scripts class ...
 

Sensuki

Arcane
Joined
Oct 26, 2012
Messages
9,800
Location
New North Korea
Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
They've changed the code of the method RunCommand in the CommandLine class - I assume that's why it's not working.

OLD

Code:
public static void RunCommand(string command)
  {
    string str1 = command;
    if (str1.ToLower() == "runcommand")
      return;
    List<string> list1 = new List<string>();
    List<string> list2 = list1;
    string str2 = str1;
    char[] chArray = new char[1];
    int index1 = 0;
    int num = 32;
    chArray[index1] = (char) num;
    string[] strArray = str2.Split(chArray);
    list2.AddRange((IEnumerable<string>) strArray);
    foreach (MethodInfo methodInfo in typeof (CommandLine).GetMethods())
    {
      if (string.Compare(methodInfo.Name, list1[0], true) == 0)
      {
        ParameterInfo[] parameters1 = methodInfo.GetParameters();
        if (parameters1 != null)
        {
          if (parameters1.Length > list1.Count - 1)
          {
            object[] objArray = new object[5];
            int index2 = 0;
            string str3 = "Command '";
            objArray[index2] = (object) str3;
            int index3 = 1;
            string str4 = list1[0];
            objArray[index3] = (object) str4;
            int index4 = 2;
            string str5 = "' requires ";
            objArray[index4] = (object) str5;
            int index5 = 3;
            // ISSUE: variable of a boxed type
            __Boxed<int> local = (System.ValueType) parameters1.Length;
            objArray[index5] = (object) local;
            int index6 = 4;
            string str6 = " parameter(s).";
            objArray[index6] = (object) str6;
            Console.AddMessage(string.Concat(objArray), Color.get_yellow());
            return;
          }
          else
          {
            object[] parameters2 = new object[parameters1.Length];
            for (int index2 = 0; index2 < parameters1.Length; ++index2)
              parameters2[index2] = (object) list1[index2 + 1];
            methodInfo.Invoke((object) null, parameters2);
            return;
          }
        }
        else
        {
          methodInfo.Invoke((object) null, (object[]) null);
          return;
        }
      }
    }
    foreach (MethodInfo methodInfo in typeof (Scripts).GetMethods())
    {
      if (string.Compare(methodInfo.Name, list1[0], true) == 0 && !Enumerable.Contains<string>((IEnumerable<string>) CommandLine.s_FinalProhibitedScripts, methodInfo.Name))
      {
        ParameterInfo[] parameters1 = methodInfo.GetParameters();
        if (parameters1.Length > list1.Count - 1)
        {
          object[] objArray = new object[5];
          int index2 = 0;
          string str3 = "Script '";
          objArray[index2] = (object) str3;
          int index3 = 1;
          string str4 = list1[0];
          objArray[index3] = (object) str4;
          int index4 = 2;
          string str5 = "' requires ";
          objArray[index4] = (object) str5;
          int index5 = 3;
          // ISSUE: variable of a boxed type
          __Boxed<int> local = (System.ValueType) parameters1.Length;
          objArray[index5] = (object) local;
          int index6 = 4;
          string str6 = " parameter(s).";
          objArray[index6] = (object) str6;
          Console.AddMessage(string.Concat(objArray), Color.get_yellow());
          return;
        }
        else
        {
          object[] parameters2 = new object[parameters1.Length];
          for (int index2 = 0; index2 < parameters1.Length; ++index2)
          {
            System.Type attributeType = (System.Type) CommandLine.s_ScriptAttributeTypes[index2];
            object[] customAttributes = methodInfo.GetCustomAttributes(attributeType, false);
            Scripts.BrowserType browserType = Scripts.BrowserType.None;
            if (customAttributes.Length > 0)
              browserType = (Scripts.BrowserType) attributeType.GetProperty("Browser").GetValue(customAttributes[0], (object[]) null);
            ParameterInfo parameterInfo = parameters1[index2];
            if (parameterInfo.ParameterType.IsEnum)
            {
              try
              {
                parameters2[index2] = Enum.Parse(parameterInfo.ParameterType, list1[index2 + 1]);
              }
              catch
              {
                parameters2[index2] = Enum.GetValues(parameterInfo.ParameterType).GetValue(0);
              }
            }
            else
            {
              if (browserType != Scripts.BrowserType.ObjectGuid)
              {
                if (parameterInfo.ParameterType != typeof (Guid))
                {
                  if (browserType == Scripts.BrowserType.Quest)
                  {
                    List<string> loadedQuests = QuestManager.Instance.FindLoadedQuests(list1[index2 + 1]);
                    if (loadedQuests.Count == 0)
                    {
                      parameters2[index2] = (object) list1[index2 + 1];
                      continue;
                    }
                    else if (loadedQuests.Count == 1)
                    {
                      parameters2[index2] = (object) loadedQuests[0];
                      continue;
                    }
                    else
                    {
                      Console.AddMessage("Multiple quests matched search '" + list1[index2 + 1] + "':", Color.get_yellow());
                      using (List<string>.Enumerator enumerator = loadedQuests.GetEnumerator())
                      {
                        while (enumerator.MoveNext())
                          Console.AddMessage(Path.GetFileNameWithoutExtension(enumerator.Current), Color.get_yellow());
                        return;
                      }
                    }
                  }
                  else if (browserType == Scripts.BrowserType.Conversation)
                  {
                    List<string> conversations = ConversationManager.Instance.FindConversations(list1[index2 + 1]);
                    if (conversations.Count == 0)
                    {
                      parameters2[index2] = (object) list1[index2 + 1];
                      continue;
                    }
                    else if (conversations.Count == 1)
                    {
                      parameters2[index2] = (object) conversations[0];
                      continue;
                    }
                    else
                    {
                      Console.AddMessage("Multiple conversations matched search '" + list1[index2 + 1] + "':", Color.get_yellow());
                      using (List<string>.Enumerator enumerator = conversations.GetEnumerator())
                      {
                        while (enumerator.MoveNext())
                          Console.AddMessage(Path.GetFileNameWithoutExtension(enumerator.Current), Color.get_yellow());
                        return;
                      }
                    }
                  }
                  else if (parameterInfo.ParameterType.IsValueType)
                  {
                    try
                    {
                      parameters2[index2] = Convert.ChangeType((object) list1[index2 + 1], parameterInfo.ParameterType);
                      continue;
                    }
                    catch (Exception ex)
                    {
                      object[] objArray = new object[7];
                      int index3 = 0;
                      string str3 = "Script error: could not convert parameter ";
                      objArray[index3] = (object) str3;
                      int index4 = 1;
                      // ISSUE: variable of a boxed type
                      __Boxed<int> local = (System.ValueType) (index2 + 1);
                      objArray[index4] = (object) local;
                      int index5 = 2;
                      string str4 = " ('";
                      objArray[index5] = (object) str4;
                      int index6 = 3;
                      string str5 = list1[index2];
                      objArray[index6] = (object) str5;
                      int index7 = 4;
                      string str6 = "') into type ";
                      objArray[index7] = (object) str6;
                      int index8 = 5;
                      string name = parameterInfo.ParameterType.Name;
                      objArray[index8] = (object) name;
                      int index9 = 6;
                      string str7 = ". ";
                      objArray[index9] = (object) str7;
                      Console.AddMessage(string.Concat(objArray), Color.get_yellow());
                      return;
                    }
                  }
                  else
                  {
                    parameters2[index2] = (object) list1[index2 + 1];
                    continue;
                  }
                }
              }
              try
              {
                parameters2[index2] = (object) new Guid(list1[index2 + 1]);
              }
              catch
              {
                GameObject gameObject = GameObject.Find(list1[index2 + 1]);
                if (Object.op_Implicit((Object) gameObject))
                {
                  InstanceID instanceId = (InstanceID) gameObject.GetComponent<InstanceID>();
                  parameters2[index2] = !Object.op_Implicit((Object) instanceId) ? (object) Guid.Empty : (object) instanceId.Guid;
                }
                else
                  parameters2[index2] = (object) Guid.Empty;
              }
            }
          }
          methodInfo.Invoke((object) null, parameters2);
          return;
        }
      }
    }
    Console.AddMessage("No command or script '" + list1[0] + "' exists.", Color.get_yellow());
  }

New

Code:
public static void RunCommand(string command)
  {
    if (command.ToLower() == "runcommand")
      return;
    List<string> list1 = new List<string>();
    List<string> list2 = list1;
    string str1 = command;
    char[] chArray = new char[1];
    int index1 = 0;
    int num = 32;
    chArray[index1] = (char) num;
    string[] strArray = str1.Split(chArray);
    list2.AddRange((IEnumerable<string>) strArray);
    foreach (MethodInfo methodInfo in Enumerable.Concat<MethodInfo>((IEnumerable<MethodInfo>) typeof (Scripts).GetMethods(), (IEnumerable<MethodInfo>) typeof (CommandLine).GetMethods()))
    {
      if (string.Compare(methodInfo.Name, list1[0], true) == 0 && !Enumerable.Contains<string>((IEnumerable<string>) CommandLine.s_FinalProhibitedScripts, methodInfo.Name))
      {
        ParameterInfo[] parameters1 = methodInfo.GetParameters();
        if (parameters1 != null)
        {
          if (parameters1.Length > list1.Count - 1)
          {
            object[] objArray = new object[5];
            int index2 = 0;
            string str2 = "Command '";
            objArray[index2] = (object) str2;
            int index3 = 1;
            string str3 = list1[0];
            objArray[index3] = (object) str3;
            int index4 = 2;
            string str4 = "' requires ";
            objArray[index4] = (object) str4;
            int index5 = 3;
            // ISSUE: variable of a boxed type
            __Boxed<int> local = (System.ValueType) parameters1.Length;
            objArray[index5] = (object) local;
            int index6 = 4;
            string str5 = " parameter(s).";
            objArray[index6] = (object) str5;
            Console.AddMessage(string.Concat(objArray), Color.get_yellow());
            return;
          }
          else
          {
            object[] parameters2 = new object[parameters1.Length];
            for (int index2 = 0; index2 < parameters1.Length; ++index2)
            {
              System.Type attributeType = (System.Type) CommandLine.s_ScriptAttributeTypes[index2];
              object[] customAttributes = methodInfo.GetCustomAttributes(attributeType, false);
              Scripts.BrowserType browserType = Scripts.BrowserType.None;
              if (customAttributes.Length > 0)
                browserType = (Scripts.BrowserType) attributeType.GetProperty("Browser").GetValue(customAttributes[0], (object[]) null);
              ParameterInfo parameterInfo = parameters1[index2];
              if (parameterInfo.ParameterType.IsEnum)
              {
                try
                {
                  parameters2[index2] = Enum.Parse(parameterInfo.ParameterType, list1[index2 + 1]);
                }
                catch
                {
                  parameters2[index2] = Enum.GetValues(parameterInfo.ParameterType).GetValue(0);
                }
              }
              else
              {
                if (browserType != Scripts.BrowserType.ObjectGuid)
                {
                  if (parameterInfo.ParameterType != typeof (Guid))
                  {
                    if (browserType == Scripts.BrowserType.Quest)
                    {
                      List<string> loadedQuests = QuestManager.Instance.FindLoadedQuests(list1[index2 + 1]);
                      if (loadedQuests.Count == 0)
                      {
                        parameters2[index2] = (object) list1[index2 + 1];
                        continue;
                      }
                      else if (loadedQuests.Count == 1)
                      {
                        parameters2[index2] = (object) loadedQuests[0];
                        continue;
                      }
                      else
                      {
                        Console.AddMessage("Multiple quests matched search '" + list1[index2 + 1] + "':", Color.get_yellow());
                        using (List<string>.Enumerator enumerator = loadedQuests.GetEnumerator())
                        {
                          while (enumerator.MoveNext())
                            Console.AddMessage(Path.GetFileNameWithoutExtension(enumerator.Current), Color.get_yellow());
                          return;
                        }
                      }
                    }
                    else if (browserType == Scripts.BrowserType.Conversation)
                    {
                      List<string> conversations = ConversationManager.Instance.FindConversations(list1[index2 + 1]);
                      if (conversations.Count == 0)
                      {
                        parameters2[index2] = (object) list1[index2 + 1];
                        continue;
                      }
                      else if (conversations.Count == 1)
                      {
                        parameters2[index2] = (object) conversations[0];
                        continue;
                      }
                      else
                      {
                        Console.AddMessage("Multiple conversations matched search '" + list1[index2 + 1] + "':", Color.get_yellow());
                        using (List<string>.Enumerator enumerator = conversations.GetEnumerator())
                        {
                          while (enumerator.MoveNext())
                            Console.AddMessage(Path.GetFileNameWithoutExtension(enumerator.Current), Color.get_yellow());
                          return;
                        }
                      }
                    }
                    else if (parameterInfo.ParameterType.IsValueType)
                    {
                      try
                      {
                        parameters2[index2] = Convert.ChangeType((object) list1[index2 + 1], parameterInfo.ParameterType);
                        continue;
                      }
                      catch (Exception ex)
                      {
                        object[] objArray = new object[7];
                        int index3 = 0;
                        string str2 = "Script error: could not convert parameter ";
                        objArray[index3] = (object) str2;
                        int index4 = 1;
                        // ISSUE: variable of a boxed type
                        __Boxed<int> local = (System.ValueType) (index2 + 1);
                        objArray[index4] = (object) local;
                        int index5 = 2;
                        string str3 = " ('";
                        objArray[index5] = (object) str3;
                        int index6 = 3;
                        string str4 = list1[index2];
                        objArray[index6] = (object) str4;
                        int index7 = 4;
                        string str5 = "') into type ";
                        objArray[index7] = (object) str5;
                        int index8 = 5;
                        string name = parameterInfo.ParameterType.Name;
                        objArray[index8] = (object) name;
                        int index9 = 6;
                        string str6 = ". ";
                        objArray[index9] = (object) str6;
                        Console.AddMessage(string.Concat(objArray), Color.get_yellow());
                        return;
                      }
                    }
                    else
                    {
                      parameters2[index2] = (object) list1[index2 + 1];
                      continue;
                    }
                  }
                }
                try
                {
                  parameters2[index2] = (object) new Guid(list1[index2 + 1]);
                }
                catch
                {
                  GameObject gameObject = GameObject.Find(list1[index2 + 1]);
                  if (Object.op_Implicit((Object) gameObject))
                  {
                    InstanceID instanceId = (InstanceID) gameObject.GetComponent<InstanceID>();
                    parameters2[index2] = !Object.op_Implicit((Object) instanceId) ? (object) Guid.Empty : (object) instanceId.Guid;
                  }
                  else
                    parameters2[index2] = (object) Guid.Empty;
                }
              }
            }
            methodInfo.Invoke((object) null, parameters2);
            return;
          }
        }
      }
    }
    Console.AddMessage("No command or script '" + list1[0] + "' exists.", Color.get_yellow());
  }
}

The command for additem always returns this line

Console.AddMessage("No command or script '" + list1[0] + "' exists.", Color.get_yellow());
 
Last edited:

Duraframe300

Arcane
Joined
Dec 21, 2010
Messages
6,395
Obsidian have also removed the additem function in this build. Probably my fault as I've been summoning items and revealing that Character Art is in a lot worse state than we expected / summoning cool looking items and posting them on the forums. I save every dll file from every build, so would someone be able to help me look for the code that restores the additem function ?

Code might be in the CommandLine class ... possibly the Scripts class ...

?

Did I miss something?
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
Obsidian have also removed the additem function in this build. Probably my fault as I've been summoning items and revealing that Character Art is in a lot worse state than we expected / summoning cool looking items and posting them on the forums.

Nah, it was either a fuck up, or unfinished code. They commands were named "forbidden" in all previous versions, but someone put the check into an unreachable place in the code. And now it's just become reachable through a small fix.

Anyway, here, I patched the dll for you: https://dl.dropboxusercontent.com/u/62420848/forsensuki.zip
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
So... Had some time to play with the console. I don't know if there's already a manual out there or what, I didn't find one, so here are some interesting commands that I found.
(Some of them might only work with the patched dll)

1. How to add an NPC to party?
You need an NPC's id first. The way you do it is simple, you just need to be on the same map with the guy.
Type FindCharacter NPCname - for example you want to add Medreth to your party, you type "FindCharacter Medreth". You will see a few lines like NPC_Medreth_Guard_Man, etc, and one of them will be NPC_Medreth. This is the id that you need.
Now type AddToParty NPC_Medreth
And voila. Here Medreth joined the party:
2014-10-26_00001.jpg


2. Change zoom range
SetZoomRange minValue maxValue - will not change your current zoom, but will allow you to zoom really close and really far with the mouse wheel... try typing SetZoomRange 0.1 200
Then your max zoom will be like this (dat grass...)
2014-10-26_00002.jpg


And your max zoom out will be this:
2014-10-26_00003.jpg


You can input any values of course.

3. Force an NPC who is not a party member to walk somewhere
AIPathToPoint guid1 guid2 movementType
guid1 = it's the guy who you want moved. For example NPC_Medreth_Guard_Dwarf
guid2 = it's where you want the guy to go. You can give him anything you can find in FindObject or FindCharacter... You can give him TurningWheel(Clone) or NPC_Villager_Female_03 and he'll go there. He won't go if he can't reach that place.
MovementType = it's a number 2, 3 or 4... 2 = walk, 3 = run, 4 = sprint
Example: AIPathToPoint NPC_Medreth_Guard_Dwarf NPC_Villager_Female_03 2

4. Make NPC (who are not party members) fight someone
Same principle as with above, the command is AIForceAttack
Example: AIForceAttack NPC_Medreth_Guard_Dwarf NPC_Medreth_Guard_Man

5. Jump to another area
AreaTransition mapname guid
If you don't know any object's ID, just type in "Waypoint_A_1" (you'll land beyond the borders, but the area will load), and then you'll use TeleportPartyToLocation (described later in this post) to position yourself on the map properly.
Example: AreaTransition AR_0002_Dyrford_Tavern_01 Waypoint_A_1
The list of all areas: https://dl.dropboxusercontent.com/u/62420848/poe-areas.txt
By the way, instead of long names, you can just use the corresponding number of the area from the file.
Most of them don't seem to be in the game right now. But when you attempt to jump there, you will see a picture of the area (which is unique for each area). For example, trying to jump to AR_1015_Od_Nua_Dragon will yield you this picture:
2014-10-26_00005.jpg


6. Unlock an area on the world map
WorldMapSetVisibility mapname visibilitytype (visibilitytypes are: 0 = locked, 1 = unlocked, 2 = hidden, 3 = developerOnly)
Of course it's useless to unlock areas that aren't supposed to be drawn on the map, like some caves.
If the name of the area indicates it to be outdoors, you can try it. For example: WorldMapSetVisibility AR_0301_Ondras_Gift_Exterior 1
Here's a screenshot of a few of them unlocked:
2014-10-26_00007.jpg


7. Deal damage to anyone
Same deal as before.
DealDamage ID value
Example: DealDamage NPC_Medreth_Guard_Man 200

8. Kill anyone
Example: Kill NPC_Medreth_Guard_Man

9. HealParty
--- Must heal party, but this one I didn't try, so it might not work.

10. Open container (ignoring lock)
Open chest_01 true
-- didn't try this one, didn't have a locked chest near me, so it might not work

11. Hire an NPC
OpenCharacterCreationNewCompanion cost endingLevel
The first parameter represents how much it will cost if the player completes this companion.
The second one stands for what level the companion will be.
Example OpenCharacterCreationNewCompanion 0 8

12. Rest
Forces rest no matter where you are and no matter what your supplies are.

13. Make someone hostile
Example: SetIsHostile CRE_Boar_Animal_Companion(Clone) true
Example2: SetIsHostile CRE_Boar_Animal_Companion(Clone) false

14. Various teleports
TeleportObejctToLocation guid guid
TeleportPartyToLocation guid
TeleportPlayerToLocation guid
Example: TeleportPartyToLocation CRE_Boar_Animal_Companion(Clone)

15. Misc
ActivateStronghold - it will allow you to click on the stronghold button and open the UI
ManageParty
Screenshake durationValue strengthValue - example Screenshake 1 1
-- Shakes the screen with a certain intensity for a certain amount of time
SoulMemoryCameraEnable true (or false)
-- Gives you some kind of tunnel vision and everything becomes somewhat purple

Stronghold UI, not much to it:
2014-10-26_00008.jpg


16. The ones I didn't figure out:
ChangeWaterLevel (guid, single, single) -- probably didn't find the right guid for water... didn't look very hard, either
EncounterSpawn (guid) -- don't know what guid to use here
AddPrisoner (guid) -- It probably puts people in your prison, but there's no interface to check that.

17. Utility
AddItem itemname number - example: AddItem misc_troll_head 1
(the names of the items are the names of the files located in PillarsOfEternity_Data\assetbundles\prefabs\objectbundle)
GivePlayerMoney number
AddExperience number
AddExperienceToLevel number -- gives you enough experience to reach level "number"
Skill charname skillname value - example: Skill player stealth 10 (player is what you type in when you mean your own character)
-- example2: Skill Companion_BB_Rogue(Clone)_3 stealth 10
(AttributeScore charname attribute value - doesn't work currently)
AddAbility charname abilityname - example: AddAbility player Defender
(the names of the abilities can also be found in PillarsOfEternity_Data\assetbundles\prefabs\objectbundle)
AddTalent talentname
(same here)
AdvanceQuest questname - didn't try
(not the same as with abilities and items... the name here is something else, but it's too boring to look into)
 
Last edited:

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
Am I correct in understanding that there is currently a level cap that doesn't allow progression past level 8? Cause I stumbled upon something in the code that basically says "if backer then maxlevel is 8, but if dev then maxlevel is 12". So I removed the cap, and yeah, there are progressiontables, spells, etc, everything till level 12. Wizard spells of level 5 and 6 are present and working, didn't check other classes. Was this thing known?


2014-10-26_00010.jpg


Anyway, in case you'd want it, here's the patched dll. It contains both the console commands fix, and the level cap is removed: https://dl.dropboxusercontent.com/u/62420848/patch2.zip
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
Trying to write a console command of my own that would spawn creatures. It's just starting to work and naturally I tried the dragon first. Yeah, it's in the game already. When it walks, the ground shakes.

2014-10-26_00012.jpg
 

Sensuki

Arcane
Joined
Oct 26, 2012
Messages
9,800
Location
New North Korea
Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
There's supposed to be a few different types of Dragons. Whatever you do don't summon the Adra Dragon [spoilerz].

Can you figure out how to disable double click shifting the camera position? It's really annoying.

That Dragon doesn't look like it has a big enough selection circle tbh. I'm not a fan of them creating creatures to size, rather than abstracted.

Are you writing your code in IL?
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
Can you figure out how to disable double click shifting the camera position? It's really annoying.
Yeah, should be easy, let me see about that. Did they introduce it in this patch or was it already there in previous version?
Also, is double click important in any other context in the game?

Are you writing your code in IL?
No, I can inject normal c# code with .Net Reflector. It's a bit tricky, but once you understand how to do it, the process is rather smooth.
For example, in this case I injected this:

Code:
public static void BesterTest(string param1)
{
   Console.AddMessage("Attempting to spawn: " + param1, UnityEngine.Color.yellow);
   UnityEngine.GameObject besterCreature;
   besterCreature = GameResources.LoadPrefab<UnityEngine.GameObject>(param1, true);
   if (besterCreature != null)
     Console.AddMessage("Spawned successfully!", UnityEngine.Color.green);
   else
     Console.AddMessage("Failed for some reason - probably bad naming.", UnityEngine.Color.red);
}
 

Sensuki

Arcane
Joined
Oct 26, 2012
Messages
9,800
Location
New North Korea
Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
It was introduced in the new patch. Previously double clicking on a portrait centered on the character, but now double clicking anywhere centers the camera (although it's buggy). I have my v301 dll if you want to grab the code from that.

Bester ah right, I tried doing that but couldn't work out how to do it (aka noob).
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
Oh, figures. I was looking for it in the decompiled assembly which was of some previous version and couldn't find it anywhere, was starting to get mad.

Decompiled the 333 assembly and found it quickly. Patched it out: https://dl.dropboxusercontent.com/u/62420848/patch3.zip

By the way, the functionality to center on character when you double click their portrait is still in the game. They simply broke it by introducing the double click on the ground event (you can report it if you want, it's obvious from the code that it's not intended). Now that I've removed it, the old functionality started to work again.
 

Bester

⚰️☠️⚱️
Patron
Vatnik
Joined
Sep 28, 2014
Messages
11,108
Location
USSR
1 - Console fix:
CommandLine -> Constructor -> changed names in s_FinalProhibitedScripts to something else like "fuckNo" or whatever

2 - Level cap removal:
CharacterStats -> GetMaxExperienceObtainable() -> changed 8 to 20

3. Camera fix:
CameraControl -> DoUpdate() -> removed this line: this.FocusOnPoint(GameInput.WorldMousePosition, 0.5f);

Now that I looked there, I noticed that forgot to include the level cap removal in that last patch. Next time.
 

As an Amazon Associate, rpgcodex.net earns from qualifying purchases.
Back
Top Bottom