TT1 Posted June 11, 2018 Posted June 11, 2018 (edited) I created some items (Sakens Kiss, at Marihi and The Codex, at Wild Mare) and I realized that at some point mods will override each other, because there is not enough Vendors and there will be a lot of items mods. So, I will try to gather all my mods in just one mod, at just one vendor, but I think we will have a problem in the future. Is there any way to help/ solve this? Edited June 11, 2018 by TT1
peardox Posted June 11, 2018 Posted June 11, 2018 I see this issue too for when I get around to creating Vendor mods. We need some way to 'own' a vendor or OBS have to allow some merging of vendor mods There are a lot of stringtable issues as well One thing that occurs to me is that it appears (not checked cos not got to vendors yet) that you could make a non-vendor a vendor opening up thousands of potential vendors - simply thinking out loud here - dunno if it'd work OK Fair warning has been applied I'm gonna move the domain to https://perspak.com early Feb but will keep all content There are reasons behind this move which basically boil down to unifying my release schedule My friends are welcome to play (I'll set you up your own areas if you desire them) Please note that this process is messy so may take a few weeks
TT1 Posted June 19, 2018 Author Posted June 19, 2018 I decided to use Wild Mare to sell all my items, so it will lower the chance of conflicts
ydaraishy Posted June 19, 2018 Posted June 19, 2018 (edited) Stringtable independence isn't so much of a problem -- pick high enough constants and tweak them if they conflict. Loot boxes (and I imagine vendors) are more of a problem since they generate from lists top-down rather than bottom up, but to fix that would require code changes in the base game... Edited June 19, 2018 by ydaraishy
peardox Posted June 19, 2018 Posted June 19, 2018 I've been regex-ing out the level files today for UUIDs (basically I'm working out who / what is where) There are 1,118 level files each of which contain between 0 and a lot UUIDs - e.g. Sanza's shop has > 100 uniques including Sanza + his pet) Many are orphans but you can track down people and items to places then back-track to the map That's where I'm up to Expanding on this items will also be in there which allow the concept of modding a chest I'll know more when I've done worldmap + items OK Fair warning has been applied I'm gonna move the domain to https://perspak.com early Feb but will keep all content There are reasons behind this move which basically boil down to unifying my release schedule My friends are welcome to play (I'll set you up your own areas if you desire them) Please note that this process is messy so may take a few weeks
Zap Gun For Hire Posted June 19, 2018 Posted June 19, 2018 One thing that occurs to me is that it appears (not checked cos not got to vendors yet) that you could make a non-vendor a vendor opening up thousands of potential vendors - simply thinking out loud here - dunno if it'd work Coincidentally, I was doing a deep dive on vendors in the game code last night as I was investigating just how discounts worked, how they were tied to factions, and when they were applied. Found out some interesting info (much of which isn't relevant to this topic). Apparently, vendors are defined all over the various gamedatabundles, but I haven't quite figured out how they are all connected. Near as I can figure, relevant entries that we care about (not counting their actual text dialogue) for vendors can be found in: characters.gamedatabundle (gives the character stats, doesn't appear to have any store info in it though) factions.gamedatabundle (gives the store the faction its tied to as well as any conditions for discounts/increases) items.gamedatabundle (gives the loot list table for the store, loot lists can be nested with one referring to another) xxxxxxxx.conversationbundle (where the store is actually opened/closed when talking with the relevant character/ship) The thing that I can't suss if figuring out how the game knows a particular store is tied to a particular character unless it is tied into the level design data that isn't easily access by use peons yet. Take for instance Sanza in Queen's Bearth. He has the following info in factions.gamedatabundle: { "$type": "Game.GameData.VendorGameData, Assembly-CSharp", "DebugName": "Vendor_03_Cartographer", "ID": "8d2d92e7-8a24-49bf-a2ba-542046f61e2a", "Components": [{ "$type": "Game.GameData.VendorComponent, Assembly-CSharp", "VendorName": 143, "StoreIconPath": "gui/innicons/storesign_generic.png", "PortraitPath": "", "StartingFactionID": "1346f12d-ca42-4add-9599-aa3fe72f5e53", "ConditionalRates": [], "LockedDescriptionString": -1 } ] } StartingFactionID ties his discounts/increases to the VTC and the discounts/increases they give when they're happy/upset. And the following info in his conversationbundle: "OnExitScripts": [ { "Data": { "FullName": "Void OpenStore(Guid)", "Parameters": [ "faafe4d0-16e3-4d76-8b34-6d42132ecd84" ], "UnrealCall": "", "FunctionHash": 215165789, "ParameterHash": 44899091 }, "Conditional": { "Operator": 0, "Components": [] } } ] which opens his actual store. The following Loot List is tied to him in items.gamedatabundle: { "$type": "Game.GameData.LootListGameData, Assembly-CSharp", "DebugName": "Store_03_Cartographer", "ID": "1522b748-9761-4c17-981c-ebe76dfc5127", "Components": [{ "$type": "Game.GameData.LootListComponent, Assembly-CSharp", "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "OutputMode": "All", "Items": [{ "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 5, "MaxCount": 5, "Weight": 1, "ItemID": "a5200562-c6ae-45b6-8d21-a3d331ae6f11", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "d9a9bf4e-8903-4806-9f93-ab7edc219fa4", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 3, "MaxCount": 5, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "7d73f078-a79e-4bf6-aa8c-c098226e2a7e", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 3, "MaxCount": 5, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "b0b26aec-689b-4e1a-944d-904dc986571d", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 3, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "5eb65b2e-0a71-4212-aa21-e28b201e6b8f", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 3, "MaxCount": 5, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "9ff68e84-9f26-4435-8292-7d4a9988ca81", "LockedVisible": "false" } ] } ] } which gives the items he sells. And his actual character entry, which doesn't seem to have any relevant info for us: { "$type": "Game.GameData.CharacterStatsGameData, Assembly-CSharp", "DebugName": "CHA_22_HR_Cartographer", "ID": "c2c1af3a-1b5d-43c6-90a8-dbe5caaa4834", "Components": [{ "$type": "Game.GameData.CharacterStatsComponent, Assembly-CSharp", "DisplayName": 489, "Gender": "Male", "RaceID": "5ea84750-17c7-419b-8beb-c121c5d68c55", "SubraceID": "48208f19-7f64-46f9-a68e-fbcb596b89eb", "CultureID": "00000000-0000-0000-0000-000000000000", "CharacterProgressionTableID": "92c24eac-7726-4200-bb06-b3ecb08025f2", "BaseClassLevel": 1, "SpeakerID": "e91bd37f-2196-43ae-80ff-21e0daf47e92", "NakedArmorMaterial": "None", "CreatureTypeGDID": "2b0d0783-3b60-4a67-abce-a5330f242833", "BestiaryEntryID": "00000000-0000-0000-0000-000000000000", "BackgroundID": "05594ae8-9d20-4592-97b5-62a1d69c1ddb", "KeywordsIDs": [], "BaseMight": 10, "BaseConstitution": 10, "BaseDexterity": 10, "BasePerception": 10, "BaseIntellect": 10, "BaseResolve": 10, "SkillsList": [], "ImmuneToEngagement": "false", "ImmuneToAttacks": "false", "PerceptionType": "Normal", "StealthDetectionID": "4b59d454-61f3-472f-906f-ff36afd861c0", "StealingAdjustmentID": "00000000-0000-0000-0000-000000000000", "StartingMaxEngageableEnemyCount": 0, "StartingAttackSpeedMultiplier": 1, "StartingRateOfFireMultiplier": 1, "StartingReloadTimeMultiplier": 1, "PersonalityID": "00000000-0000-0000-0000-000000000000", "AnimationAudioEventListID": "325265c3-af6f-410b-9c16-42964b602404", "MinLevelAdjustment": -50, "MaxLevelAdjustment": 50, "IsNamedCharacter": "false" }, { "$type": "Game.GameData.EquipmentSetComponent, Assembly-CSharp", "HeadID": "00000000-0000-0000-0000-000000000000", "NeckID": "00000000-0000-0000-0000-000000000000", "CapeID": "00000000-0000-0000-0000-000000000000", "ChestID": "382d5e63-6f49-4240-bfb1-45026bfe548f", "HandsID": "00000000-0000-0000-0000-000000000000", "RightHandRingID": "00000000-0000-0000-0000-000000000000", "LeftHandRingID": "00000000-0000-0000-0000-000000000000", "FeetID": "00000000-0000-0000-0000-000000000000", "WaistID": "00000000-0000-0000-0000-000000000000", "GrimoireOrTrinketID": "00000000-0000-0000-0000-000000000000", "PetID": "00000000-0000-0000-0000-000000000000", "WeaponSets": [], "PropsIDs": [] } ] } What I can't figure out is how the game knows that LootList "1522b748-9761-4c17-981c-ebe76dfc5127" is tied to store "8d2d92e7-8a24-49bf-a2ba-542046f61e2a" and is opened when "faafe4d0-16e3-4d76-8b34-6d42132ecd84" is called in his conversation bundle. Usually I can track this stuff down with the relevant info in the rest of the files, but this time I'm coming up empty. Maybe I'm missing something in one of the databundles though. Wouldn't surprise me given how complex this game is.
Zap Gun For Hire Posted June 19, 2018 Posted June 19, 2018 I've been regex-ing out the level files today for UUIDs (basically I'm working out who / what is where) There are 1,118 level files each of which contain between 0 and a lot UUIDs - e.g. Sanza's shop has > 100 uniques including Sanza + his pet) Many are orphans but you can track down people and items to places then back-track to the map That's where I'm up to Expanding on this items will also be in there which allow the concept of modding a chest I'll know more when I've done worldmap + items Posted this while I was typing up my post. So, yeah, looks like what I was looking for is tied in the level design then, yes?
ydaraishy Posted June 19, 2018 Posted June 19, 2018 (edited) > What I can't figure out is how the game knows that LootList "1522b748-9761-4c17-981c-ebe76dfc5127" is tied to store "8d2d92e7-8a24-49bf-a2ba-542046f61e2a" and is opened when "faafe4d0-16e3-4d76-8b34-6d42132ecd84" is called in his conversation bundle. $ grep -l 1522b748-9761-4c17-981c-ebe76dfc5127 * items.gamedatabundle In fact, that is the only instance where that UUID is seen in the bundles. What items are these anyway? sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == "1522b748-9761-4c17-981c-ebe76dfc5127") | .Components[0].Items[].ItemID | select(. != "00000000-0000-0000-0000-000000000000")' "a5200562-c6ae-45b6-8d21-a3d331ae6f11" "d9a9bf4e-8903-4806-9f93-ab7edc219fa4" Resolving these to DebugNames: sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == "a5200562-c6ae-45b6-8d21-a3d331ae6f11" or .ID == "d9a9bf4e-8903-4806-9f93- ab7edc219fa4") | .DebugName' "GI_Spyglass" "Lockpick" What about the loot lists? $ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == "1522b748-9761-4c17-981c-ebe76dfc5127") | .Components[0].Items[].LootListID | select(. != "00000000-0000-0000-0000-000000000000")' "7d73f078-a79e-4bf6-aa8c-c098226e2a7e" "b0b26aec-689b-4e1a-944d-904dc986571d" "5eb65b2e-0a71-4212-aa21-e28b201e6b8f" "9ff68e84-9f26-4435-8292-7d4a9988ca81" $ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == "7d73f078-a79e-4bf6-aa8c-c098226e2a7e" or .ID == "b0b26aec-689b-4e1a-944d- 904dc986571d" or .ID == "5eb65b2e-0a71-4212-aa21-e28b201e6b8f" or .ID == "9ff68e84- 9f26-4435-8292-7d4a9988ca81") | .DebugName' "Loot_Small_Consumables_Potions" "Loot_Small_Consumables_Potions_Healing" "Loot_Small_Consumables_Scrolls" "Loot_Small_Lore_Books" Can you kill Sanza? Is this effectively just his loot drop? Since the OpenStore UUID isn't visible in any of the game bundles, perhaps this may be static/not exported. Edited June 19, 2018 by ydaraishy
Zap Gun For Hire Posted June 20, 2018 Posted June 20, 2018 (edited) What about the loot lists? $ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == "1522b748-9761-4c17-981c-ebe76dfc5127") | .Components[0].Items[].LootListID | select(. != "00000000-0000-0000-0000-000000000000")' "7d73f078-a79e-4bf6-aa8c-c098226e2a7e" "b0b26aec-689b-4e1a-944d-904dc986571d" "5eb65b2e-0a71-4212-aa21-e28b201e6b8f" "9ff68e84-9f26-4435-8292-7d4a9988ca81" $ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == "7d73f078-a79e-4bf6-aa8c-c098226e2a7e" or .ID == "b0b26aec-689b-4e1a-944d- 904dc986571d" or .ID == "5eb65b2e-0a71-4212-aa21-e28b201e6b8f" or .ID == "9ff68e84- 9f26-4435-8292-7d4a9988ca81") | .DebugName' "Loot_Small_Consumables_Potions" "Loot_Small_Consumables_Potions_Healing" "Loot_Small_Consumables_Scrolls" "Loot_Small_Lore_Books" Can you kill Sanza? Is this effectively just his loot drop? The Loot Lists are just a common pool for store sellers and various chests so, presumably, the game doesn't have to repeat them over and over again for various things. To give one example, here is the code for the loot list "Loot_Small_Lore_Books": { "$type": "Game.GameData.LootListGameData, Assembly-CSharp", "DebugName": "Loot_Small_Lore_Books", "ID": "7d73f078-a79e-4bf6-aa8c-c098226e2a7e", "Components": [{ "$type": "Game.GameData.LootListComponent, Assembly-CSharp", "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "OutputMode": "OneRandom", "Items": [{ "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "97b25457-a2be-470e-b4ee-7b9c0e28febc", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "2873ba30-6008-496d-ab63-28a4a1df0ed7", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "efa11f1a-6d67-4316-ae76-3e4dcaed1feb", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "27906fbb-5bca-4d50-a915-4fd5b7318f75", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "d507a8fd-742f-4257-84d5-21430d862124", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "1a06c41f-34f0-404d-8f09-7e381a76a7e7", "LockedVisible": "false" } ] } ] } "OutputMode: OneRandom" presumably means it will take one item from the list supplied. In that list there are seven more sets of loot lists to choose from: "0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9": ( "Loot_Small_Lore_Books_Aedyran") "97b25457-a2be-470e-b4ee-7b9c0e28febc": ("Loot_Small_Lore_Books_Dyrwoodan") "2873ba30-6008-496d-ab63-28a4a1df0ed7": ("Loot_Small_Lore_Books_Huana") "efa11f1a-6d67-4316-ae76-3e4dcaed1feb": ("Loot_Small_Lore_Books_Rauataian") "27906fbb-5bca-4d50-a915-4fd5b7318f75": ("Loot_Small_Lore_Books_Vailian") "d507a8fd-742f-4257-84d5-21430d862124": ("Loot_Small_Lore_Books_Engwithan") "1a06c41f-34f0-404d-8f09-7e381a76a7e7": ("Loot_Small_Lore_Books_General") Each of those lists points to yet another list. Let's just choose the first one ("0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9") (it's long, so I'll put it in a spoiler box) { "$type": "Game.GameData.LootListGameData, Assembly-CSharp", "DebugName": "Loot_Small_Lore_Books_Aedyran", "ID": "0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9", "Components": [{ "$type": "Game.GameData.LootListComponent, Assembly-CSharp", "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "OutputMode": "OneRandom", "Items": [{ "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "eb7cefb4-d975-4e2e-bc20-e2c3e85dde34", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "4159bb26-d808-400b-964c-c2e83bdd1f6d", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "f6756286-c011-4709-96e6-6fede4e2b499", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "b2fb9a81-21f5-4686-889c-a2f5a6d62f61", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "f0276b0c-7183-4bbd-80e8-885531a28d3a", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "df498f4f-69bc-4322-a58a-966f15cd6a06", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "7c4227c2-cce2-438a-adf6-aac9e6e51e4e", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "72c3a821-604c-4e01-a33b-1827579ce286", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "ca75c9c7-ca7d-4df9-99b0-ba74c26c04f7", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "01dedf46-9747-4697-a7b3-e8617d15b564", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "7f2805bf-4883-4d0f-897c-76aade56c601", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "bd98c69f-8144-4302-8a2e-b8b0dff55647", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "20f25393-30c0-400a-be1a-786177fc24bc", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "90b50dfd-6243-4848-94a7-6393451c5a81", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "95298842-2c95-4798-82f4-c77ad369a27f", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "8417e2b6-113d-495c-90ff-63f51390e731", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "5505de1b-c043-4377-a2e7-52deb5773309", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "66df1340-2cec-4023-8a2c-4adb693808bc", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "c9dfe01f-4c20-4e68-88dc-6b83ce6e6ae5", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "7e3379f0-b28f-46c0-a289-e761d663b616", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "50d2de59-9d8e-4a27-9f35-0bf22a188f97", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "ca71ef8b-e084-4306-999f-f17edfe97c45", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "0f42f903-3d58-4c93-94b8-74170334fd9a", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "614ea80f-37e5-4b28-b233-91c7a8bcfc48", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "f48c6e24-a5eb-4423-9cbb-f5f80d164a29", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "eef8ee41-07cb-437f-a5d1-ad6f2043916e", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "dff9da42-ce19-4e0b-9370-261e1124fb66", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "03e6163b-1b01-48ca-a02c-186801b807f9", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "a2000aa2-3275-42db-813a-e9a6f40ff72d", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" }, { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 1, "MaxCount": 1, "Weight": 1, "ItemID": "68d08a9f-c618-4e91-8092-b7a29149dc6c", "LootListID": "00000000-0000-0000-0000-000000000000", "LockedVisible": "false" } ] } ] } We're finally at the end of the tree here. Each of those codes corresponds to a specific book in the game. Once again, it will pick just one item from the list supplied. For example, the game might pick "dff9da42-ce19-4e0b-9370-261e1124fb66" which is one of the Woedican Holy Texts ("Psalm to Woedica" in case people care). So, basically, in this case, it's a branching tree to pick an item. At the top of his loot list it also said this: { "Conditional": { "Operator": 0, "Components": [] }, "OutputChance": 1, "MinCount": 3, "MaxCount": 5, "Weight": 1, "ItemID": "00000000-0000-0000-0000-000000000000", "LootListID": "7d73f078-a79e-4bf6-aa8c-c098226e2a7e", "LockedVisible": "false" } The OutputChance of 1 means that there's a 100% chance the game will check the following list for items to put in the store/container. The MInCount of 3 means that the list will be checked at least three times and the MaxCount of 5 means no more than five times. The entire upshot of all that stuff above (including the many many many LootLists I didn't copy over, is that there will be three to five lore books in his store to be bought, randomly chosen from a bunch of different possibilities. And that's just from one of his LootListID checks. He has a few more. Basically the real way to tell if something is checking another LootList is if the ItemID is blank. If it is, it's pointing to another list. If it isn't, you've either reached the end of a tree or there wasn't a tree to begin with, as in the case of the guaranteed Spyglass and lockpicks. ==== As for killing him and taking his stuff, the game handles that differently, though where it's defined I couldn't tell you right this moment. So, no, killing him will NOT give you stuff he had for sale in his store. Edited June 20, 2018 by Zap Gun For Hire 1
peardox Posted June 20, 2018 Posted June 20, 2018 1522b748-9761-4c17-981c-ebe76dfc5127 This is what I was on about with levels - it's explicitly referenced in level20 (Sanza's Store) Any changes to it should result in changes owing to this reason I've got a DB of all the GUIDs and which level file they occur in It's not much use yet as I need to cross-reference this with the levels, characters, items etc (wrote a mod this AM - will get back to this sometime soon) 2 OK Fair warning has been applied I'm gonna move the domain to https://perspak.com early Feb but will keep all content There are reasons behind this move which basically boil down to unifying my release schedule My friends are welcome to play (I'll set you up your own areas if you desire them) Please note that this process is messy so may take a few weeks
peardox Posted June 20, 2018 Posted June 20, 2018 (edited) OK - there's a huge shortfall in GUIDs There are 17,113 in exported and 57,175 in levelXXXX These are Unique per file ignoring 00000000-0000-0000-0000-000000000000 Some GUIDs are in multiple files I'm examining But the breakdown ain't any better (far worse) 5,068 vs 44,200 If anyone want's my data and knows how to drive MySQL drop me a note and I'll make it all available (anyone can do this so I'm simply saving time for other devs) - it's not well connected yet (lots of files yet to do) but I'll try to explain everything Note that the MySQL only uses the English stringtables (so I can read them) - it's extremely easy to do extracts for other languages so if you need them just ask. Edited June 20, 2018 by peardox OK Fair warning has been applied I'm gonna move the domain to https://perspak.com early Feb but will keep all content There are reasons behind this move which basically boil down to unifying my release schedule My friends are welcome to play (I'll set you up your own areas if you desire them) Please note that this process is messy so may take a few weeks
peardox Posted June 20, 2018 Posted June 20, 2018 The above exploration was simply working out how the world works (trying to stuff crap in chests etc). Tomorrow I'm gonna explore turning a named NPC into a vendor (cross fingers on this one) Any scripted character can theoretically have their own shop - there's a script to open their store for example. Think I'll try Waenglith (again) I'll, obviously, share my frustrations and (hopefully) end result if I can get it to work IF I get this working it'll completely remove the lack of vendors (last try didn't work) 1 OK Fair warning has been applied I'm gonna move the domain to https://perspak.com early Feb but will keep all content There are reasons behind this move which basically boil down to unifying my release schedule My friends are welcome to play (I'll set you up your own areas if you desire them) Please note that this process is messy so may take a few weeks
TT1 Posted June 21, 2018 Author Posted June 21, 2018 The above exploration was simply working out how the world works (trying to stuff crap in chests etc). Tomorrow I'm gonna explore turning a named NPC into a vendor (cross fingers on this one) Any scripted character can theoretically have their own shop - there's a script to open their store for example. Think I'll try Waenglith (again) I'll, obviously, share my frustrations and (hopefully) end result if I can get it to work IF I get this working it'll completely remove the lack of vendors (last try didn't work) Please tell me if you have any luck with this. Sounds really promising.
TT1 Posted June 21, 2018 Author Posted June 21, 2018 Well, peardox seems to have all the ids in a database. Maybe in time we call work in something like this: Could be nice to have a "create your own custom item" tool that write the gamedata files. Not so far, actually.
ydaraishy Posted June 21, 2018 Posted June 21, 2018 (edited) > Could be nice to have a "create your own custom item" tool that write the gamedata files. Not so far, actually. As I've mentioned elsewhere, jq will process the gamedata files for you. You can do things like copying an existing item and patching it with the changes you want, or you can work out a blank item JSON and merge your own changes into it. The technology exists already. Edited June 21, 2018 by ydaraishy
TT1 Posted June 21, 2018 Author Posted June 21, 2018 > Could be nice to have a "create your own custom item" tool that write the gamedata files. Not so far, actually. As I've mentioned elsewhere, jq will process the gamedata files for you. You can do things like copying an existing item and patching it with the changes you want, or you can work out a blank item JSON and merge your own changes into it. The technology exists already. Yeah, sure, but could be like this diablo editor, from the video. Something more friendly.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now