Jump to content

Loot Lists, How do they Work?


Recommended Posts

As the title says, i need to know more about loot lists. For the past 2 days ive been unsuccessfully attempting to generate loot into the Soul Collector . While i can do it in game via GiveItemsToObject(Guid, Guid, Int32) as well as with the GenerateLootListInto(Guid, Guid) i can not for the life of me get either of these scripts to trigger by themselves from a mod file. 

 

I'd really love some understanding not only how lootlists at large work, and how i can get them to trigger into existing instanced objects like say the Soul Collector, or a hidden container like  here

 

If any one can help, or point me in the right direction I'd be super grateful

Link to comment
Share on other sites

As the title says, i need to know more about loot lists. For the past 2 days ive been unsuccessfully attempting to generate loot into the Soul Collector . While i can do it in game via GiveItemsToObject(Guid, Guid, Int32) as well as with the GenerateLootListInto(Guid, Guid) i can not for the life of me get either of these scripts to trigger by themselves from a mod file. 

 

I'd really love some understanding not only how lootlists at large work, and how i can get them to trigger into existing instanced objects like say the Soul Collector, or a hidden container like  here

 

If any one can help, or point me in the right direction I'd be super grateful

 

I guess they are inside the level self, that's why you don't found them.

Edited by kilay
Link to comment
Share on other sites

As the title says, i need to know more about loot lists. For the past 2 days ive been unsuccessfully attempting to generate loot into the Soul Collector . While i can do it in game via GiveItemsToObject(Guid, Guid, Int32) as well as with the GenerateLootListInto(Guid, Guid) i can not for the life of me get either of these scripts to trigger by themselves from a mod file. 

 

I'd really love some understanding not only how lootlists at large work, and how i can get them to trigger into existing instanced objects like say the Soul Collector, or a hidden container like  here

 

If any one can help, or point me in the right direction I'd be super grateful

Are you trying to modify the Soul Collectors found in the DLC or the one found in the base game?

 

edited

 

I wiped my answer about the DLC after looking into your screenshot.

 

Yeah, there doesn't appear to be a LootList for the base game Soul Collecter in items.gamedatabundle.  Many of the LootLists for containers and critters are gated into the code via level design and not available for us peons.

Edited by Zap Gun For Hire
Link to comment
Share on other sites

I was able to rig a work around for the moment but its real ghetto.  As you can see here:

{
		"$type": "Game.GameData.ItemGameData, Assembly-CSharp",
		"DebugName": "Part_Spirit_residue",
		"ID": "e474463c-1c74-44c5-945c-385d864b6974",
		"Components": [{
				"$type": "Game.GameData.ItemComponent, Assembly-CSharp",
				"DisplayName": 850,
				"DescriptionText": 1458,
				"FilterType": "Ingredients",
				"InventoryAudioEventListID": "705deb97-3f84-48c8-a84b-e3c34e2d0e3a",
				"IsQuestItem": "false",
				"IsIngredient": "true",
				"IsCurrency": "false",
				"IsAdventuringItem": "false",
				"CanSellForFullValue": "false",
				"MaxStackSize": 999,
				"NeverDropAsLoot": "false",
				"CanBePickpocketed": "false",
				"IsUnique": "false",
				"Value": 95,
				"IconTextureSmall": "gui/icons/items/ingredients/spirit_residue_s.png",
				"IconTextureLarge": "gui/icons/items/ingredients/spirit_residue_l.png",
				"PencilSketchTexture": "",
				"InspectOnUseButton": [],
				"IsPlaceholder": "false"
				}, {
				"$type": "Game.GameData.DataScriptEventComponent, Assembly-CSharp",
				"Scripts": [{
						"Event": "OnItemCollected",
						"Script": {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"Scripts": [{
								"Data": {
									"FullName": "Void GenerateLootListInto(Guid, Guid)",
						"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "6897484c-1502-4300-bd2b-bc68be30d263"],
									"Flags": "",
									"UnrealCall": "",
									"FunctionHash": 0,
									"ParameterHash": 0
										},
										"Conditional": {
											"Operator": 0,
											"Components": []
										}
									}
								]
							}
						}
					]
				}
			]
		

My God i dont know how to format on here.. But as you can see i was able to get the script to hook, only problem is the script fires EVERY time i loot a spirit residue. Any chance you guys know of a way i can kill the script once its fired once?

Link to comment
Share on other sites

Here were two work arounds i was able to come up with that, while not perfect, they are capable of getting the job done. Just gotta make sure to loot the Spirit Residue before the unique boots. This work around hooks into the "OnItemCollected" Event: 

"$type": "Game.GameData.DataScriptEventComponent, Assembly-CSharp",
					"Scripts": [{
							"Event": "OnItemCollected",
							"Script": {
								"Conditional": {
									"Operator": 0,
									"Components": []
								},
								"Scripts": [{
										"Data": {
											"FullName": "Void GenerateLootListInto(Guid, Guid)",
											"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "6897484c-1502-4300-bd2b-bc68be30d263"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 0,
											"ParameterHash": 0
										},
										"Conditional": {
											"Operator": 0,
											"Components": [{
													"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
													"Data": {
														"FullName": "Boolean ObjectHasItemCount(Guid, Guid, Operator, Int32)",
														"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "77c22eeb-0d74-4fbf-a229-910271711608", "EqualTo", "0"],
														"Flags": "",
														"UnrealCall": "",
														"FunctionHash": 0,
														"ParameterHash": 0
													},
													"Not": false,
													"Operator": 0

again sorry for my poor formatting. You can see the the extra conditional i added here : 

"FullName": "Boolean ObjectHasItemCount(Guid, Guid, Operator, Int32)",

"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "77c22eeb-0d74-4fbf-a229-910271711608", "EqualTo", "0"], what this did is made it so the GenerateLootList only fired when my custom item, represented by GUID: "77c22eeb-0d74-4fbf-a229-910271711608"  was only at '0' instances.

 

 

Here is a 2nd version of the work around but its scripted as a conditional from the LootListDataComponet, instead of as a Data Script Event. :

"$type": "Game.GameData.LootListComponent, Assembly-CSharp",
					"Conditional": {
						"Operator": 0,
						"Components": []
					},
					"OutputChance": 1,
					"OutputMode": "All",
					"Items": [{
							"Conditional": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean ObjectHasItemCount(Guid, Guid, Operator, Int32)",
											"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "77c22eeb-0d74-4fbf-a229-910271711608", "EqualTo", "0"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 0,
											"ParameterHash": 0
										},
										"Not": false,
										"Operator": 0
									}
								]
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "77c22eeb-0d74-4fbf-a229-910271711608",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"

again poor formatting, my apologies butr as you can see, same thing just triggers from the lootlistcomponent. So its not nearly as clean as a true LootList to an instanced creature would be, but it does get the job done for he time being. If any one wants me to put up the whole file let me know.

  • Like 1
Link to comment
Share on other sites

Hey I appreciate any help i could get. I actually tried using the LL_Lurker_Bog loot list earlier but i couldnt get it to work, either way though its all good and i appreciate the help. I was always hoping to have specific enough conditions to guarantee that it was one unique drop, so i was always gonna be looking for something to point to that one specific instance of that Soul Collector. 

 

I Do think i have something thats as close to a loot list pointing to that specific Soul Collector  as i can get. heres my finished work around:

{
	"$type": "Game.GameData.ItemGameData, Assembly-CSharp",
	"DebugName": "Part_Spirit_residue",
	"ID": "e474463c-1c74-44c5-945c-385d864b6974",
	"Components": [{
			"$type": "Game.GameData.ItemComponent, Assembly-CSharp",
			"DisplayName": 850,
			"DescriptionText": 1458,
			"FilterType": "Ingredients",
			"InventoryAudioEventListID": "705deb97-3f84-48c8-a84b-e3c34e2d0e3a",
			"IsQuestItem": "false",
			"IsIngredient": "true",
			"IsCurrency": "false",
			"IsAdventuringItem": "false",
			"CanSellForFullValue": "false",
			"MaxStackSize": 999,
			"NeverDropAsLoot": "false",
			"CanBePickpocketed": "false",
			"IsUnique": "false",
			"Value": 95,
			"IconTextureSmall": "gui/icons/items/ingredients/spirit_residue_s.png",
			"IconTextureLarge": "gui/icons/items/ingredients/spirit_residue_l.png",
			"PencilSketchTexture": "",
			"InspectOnUseButton": [],
			"IsPlaceholder": "false"
		}, {
			"$type": "Game.GameData.DataScriptEventComponent, Assembly-CSharp",
			"Scripts": [{
				"Event": "OnItemDroppedAsLoot",
				"Script": {
					"Conditional": {
						"Operator": 0,
						"Components": [{
							  "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
								"Data": {
								"FullName": "Boolean IsInScene(Guid, Guid)",
			                                        "Parameters": ["b1a8e901-0000-0000-0000-000000000000", "0159a190-8857-480f-bfd5-0f43b61d6424"],
								"Flags": "",
								"UnrealCall": "",
								"FunctionHash": 0,
								"ParameterHash": 0
								},
								"Not": false,
								"Operator": 0
							}
						]
					},
					"Scripts": [{
						    "Data": {
							"FullName": "Void GenerateLootListInto(Guid, Guid)",
							"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "6897484c-1502-4300-bd2b-bc68be30d263"],
							"Flags": "",
							"UnrealCall": "",
							"FunctionHash": 0,
							"ParameterHash": 0
						     },
						     "Conditional": {
							        "Operator": 0,
								"Components": [{
								"$type" "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
								            "Data": {
									                "FullName": "Boolean ObjectHasItemCount(Guid, Guid, Operator, Int32)",
											"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "77c22eeb-0d74-4fbf-a229-910271711608", "EqualTo", "0"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 0,
											"ParameterHash": 0
										},
										"Not": false,
										"Operator": 0
										}
									]
								}
							}
						]
					}
				}
			]
	}
     ]
}

Hopefully my formatting is better this time too..  Anyways i changed the event call from "Event": "OnItemCollected", to "Event": "OnItemDroppedAsLoot", . 

 

I also added a condition to that originating script event, one problem i didnt want to have was having this script fire every ****ing time i picked up spirit residue, or every time one dropped. so i added: 

 

"FullName": "Boolean IsInScene(Guid, Guid)",

"Parameters": ["b1a8e901-0000-0000-0000-000000000000", "0159a190-8857-480f-bfd5-0f43b61d6424"],   
 
If Im not mistaken, the way its set up is that unless those conditions(read: "Parameters", the first GUID being the Player and the Second GUID represents the zone's GUID)   are met then the "OnItemDroppedAsLoot" event script doesnt even fire. so it solves the problem of going off every time a ghost/spirit etc. drops loot basically.
 
And the Bottom condition call:
 
"FullName": "Boolean ObjectHasItemCount(Guid, Guid, Operator, Int32)",
"Parameters": ["9bef9fbc-eec8-4aeb-996c-b22da1f2ff4c", "77c22eeb-0d74-4fbf-a229-910271711608", "EqualTo", "0"],
 
Ensures that once the Soul Collector has the one unique pair of boots in his inventory it stops spamming him with more supposedly super rare unique boots spawns.
 
So I think the work around is finished, its worked out so far and nothing scary came up in the output_log so i think its good to go. 
 
Im gonna attach a screenshot incase any one wants to take a look at it all properly formatted.

 

post-217990-0-84596000-1533727064_thumb.jpg

  • Like 1
Link to comment
Share on other sites

This should be sticky, cuz it works like a charm and might be a useful template . Great job.


 

Edited by kilay
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...