Jump to content

Detect and remove an item from inventory


Recommended Posts

Hello, I am trying to create a character who has a blaster. I was wondering if it is possible to check if the player has a certain item(charged batteries), then remove a certain number of those batteries, and then add back in uncharged batteries?

 

Any help would be much appreciated.

Link to comment
Share on other sites

You can use player.components.inventory:FindItem(itemtestfunction) to iterate the players inventory, it returns the first item found. "itemtestfunction" receives every item as parameter once and has to return true if the item matches the criteria.

 

Then, if there is an item found, you can simply use inst:Remove() and give a new item to the player using player.components.inventory:GiveItem(SpawnPrefab("myitem"))

Link to comment
Share on other sites

an example:

player.components.inventory:FindItem(function(item) return item.prefab=="battery" end)
so the game will just go over each item in your inventory and use this function on them:

function(item) return item.prefab=="battery" end
and if this returns true(in this case, if the prefabname of your item is "battery") then FindItem returns that item.
Link to comment
Share on other sites

Thanks for replying, but I am still not quite able to pull it off.

 

Right now, I have this in my code:

local function onattack_blaster()	ThePlayer.components.inventory.FindItem(function(item) return item.prefab=="item_battery_charged" end)	end

and it crashes with this in the log the moment I call that function

[00:01:09]: [string "scripts/components/inventory.lua"]:362: attempt to index local 'self' (a function value)LUA ERROR stack traceback:scripts/components/inventory.lua:362 in (field) FindItem (Lua) <361-374>   self = function - ../mods/DSTmod-Orion_Castilio/scripts/prefabs/item_blaster.lua:23   fn = nil../mods/DSTmod-Orion_Castilio/scripts/prefabs/item_blaster.lua:23 in (field) onprojectilelaunch (Lua) <21-25>scripts/components/weapon.lua:91 in (method) LaunchProjectile (Lua) <87-105>   self =      inst = 112033 - item_blaster(LIMBO) (valid:true)      projectile = fire_projectile      onprojectilelaunch = function - ../mods/DSTmod-Orion_Castilio/scripts/prefabs/item_blaster.lua:21      hitrange = 10      _ = table: 222704E8      damage = 0   attacker = 111502 - orion (valid:true)   target = 112097 - robin (valid:true)scripts/components/combat.lua:720 in (method) DoAttack (Lua) <701-763>   self =      hiteffectsymbol = torso      laststartattacktime = 10.633333887905      lastwasattackedtime = 0      playerdamagepercent = 1      nextbattlecrytime = 18.41927706244      pvp_damagemod = 0.5      GetGiveUpString = function - scripts/prefabs/player_common.lua:10      forcefacing = true      keeptargettimeout = 0      defaultdamage = 10      inst = 111502 - orion (valid:true)      losetargetcallback = function - scripts/components/combat.lua:248      GetBattleCryString = function - scripts/prefabs/player_common.lua:1379      battlecryenabled = true      _ = table: 2AF9F9B8      hitrange = 2   target_override = 112097 - robin (valid:true)   weapon = nil   projectile = nil   stimuli = nil   instancemult = nil   targ = 112097 - robin (valid:true)   weapon = 112033 - item_blaster(LIMBO) (valid:true)scripts/actions.lua:542 in (field) fn (Lua) <541-544>   act = Attack 112097 - robin With Inv:112033 - item_blaster(LIMBO) (valid:true)scripts/bufferedaction.lua:22 in (method) Do (Lua) <19-35>   self (valid:true) =      action = table: 1211C5D8      invobject = 112033 - item_blaster(LIMBO) (valid:true)      onfail = table: 36A90CF0      doerownsobject = true      autoequipped = true      target = 112097 - robin (valid:true)      options = table: 36A90D40      doer = 111502 - orion (valid:true)      onsuccess = table: 36A90638scripts/entityscript.lua:1193 in (method) PerformBufferedAction (Lua) <1185-1203>   self (valid:true) =      DynamicShadow = DynamicShadow (21A8DE00)      inlimbo = false      GetMoistureRateScale = function - scripts/prefabs/player_common.lua:97      SetCameraDistance = function - scripts/prefabs/player_common.lua:1033      ScreenFlash = function - scripts/prefabs/player_common.lua:1087      player_classified = 111503 - player_classified (valid:true)      playercolour = table: 3F9FD0C0      AnimState = AnimState (21A8D4A0)      Light = Light (21A8F8A0)      OnRemoveEntity = function - scripts/prefabs/player_common.lua:526      pendingtasks = table: 3FD3B088      ShowHUD = function - scripts/prefabs/player_common.lua:1027      sg = sg="wilson", state="attack", time=0.27, tags = "attack,abouttoattack,notalking,autopredict,"      IsHUDVisible = function - scripts/prefabs/player_common.lua:1017      ApplyScale = function - scripts/prefabs/player_common.lua:1102      SetGhostMode = function - scripts/prefabs/player_common.lua:442      CanExamine = function - scripts/prefabs/player_common.lua:20      HUD = HUD      OnWakeUp = function - scripts/prefabs/player_common.lua:950      Transform = Transform (21A8D200)      actionreplica = table: 3FD3AB60      batteriesnum = 0      blasterstun = false      blasterincinerate = false      lower_components_shadow = table: 3FD39FD0      GetMaxMoisture = function - scripts/prefabs/player_common.lua:87      prefab = orion      updatecomponents = table: 2AFA5318      ShakeCamera = function - scripts/prefabs/player_common.lua:1047      OnDespawn = function - scripts/prefabs/player_common.lua:968      Physics = Physics (21A90480)      MiniMapEntity = MiniMapEntity (21A8F1C0)      IsFreezing = function

Am I still not using it correctly? Take note that I am modding for DST

log.txt

Link to comment
Share on other sites

Alright, now I have a new problem. The I can find, remove and replace the batteries. However, the batteries are and should be stackable, and it is removing the whole stack of batteries. It does however, only remove one battery if there is only one in a stack. How would I make it so that it only removes a certain number of batteries?

local function onattack_blaster(inst, attacker, target, skipsanity)	if ThePlayer.components.inventory:FindItem(function(item) return item.prefab=="item_battery_charged" end) then		ThePlayer.components.talker:Say("I have a charged battery")		local batt = ThePlayer.components.inventory:FindItem(function(item) return item.prefab=="item_battery_charged" end)		batt:Remove()		ThePlayer.components.inventory:GiveItem(SpawnPrefab("item_battery"))			else		ThePlayer.components.talker:Say("I do not have a charged battery")	end	end
Link to comment
Share on other sites

 

Alright, now I have a new problem. The I can find, remove and replace the batteries. However, the batteries are and should be stackable, and it is removing the whole stack of batteries. It does however, only remove one battery if there is only one in a stack. How would I make it so that it only removes a certain number of batteries? 

 

I see. Luckily the stackable component has a function for that:

inst.components.stackable:Get(1) --returns one item of the stack

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

Please be aware that the content of this thread may be outdated and no longer applicable.

×
  • Create New...