RinShigure Posted June 24, 2017 Share Posted June 24, 2017 Hello everyone, i am looking for a way in wich i can detect what mob is killed by the player, looking specifically for shadow creatures, so that they can boost a little the sanity they give. This is what i have so far obtained directly from wigfrids lua, but i don't get what exactly does the function "IsValidVictim", can someone make a basic explanation of this, does it return the full entity of the victim or just it's tags, please: local function IsValidVictim(victim) return victim ~= nil and not ((victim:HasTag("prey") and not victim:HasTag("hostile")) or victim:HasTag("veggie") or victim:HasTag("structure") or victim:HasTag("wall") or victim:HasTag("companion")) and victim.components.health ~= nil and victim.components.combat ~= nil end local function onkilled(inst, data) local sntybst = 0 local victim = data.victim if IsValidVictim(victim) then if (victim:HasTag("shadowcreature") then inst.components.sanity:DoDelta(victim.sanityreward or TUNING.SANITY_SMALL) end end end Problem is i can't test it right now, so can anyone help me out telling me if it is correct??, thanks in advance your opinions are wellcome. Link to comment https://forums.kleientertainment.com/forums/topic/80136-function-to-detect-what-is-killed/ Share on other sites More sharing options...
DarkXero Posted June 24, 2017 Share Posted June 24, 2017 3 hours ago, RinShigure said: wigfrids lua When an entity with combat component kills another entity with combat component, the event "killed" gets pushed on the killer. inst:ListenForEvent("killed", onkilled) Wigfrid listens to that one. If we go to the combat component, the event is pushed with data containing the victim. attacker:PushEvent("killed", { victim = self.inst }) onkilled will receive a table that has one key "victim" with a value that is the killed entity. local victim = data.victim if IsValidVictim(victim) then onkilled will extract the victim value and call a function with it. local function IsValidVictim(victim) return victim ~= nil and not ((victim:HasTag("prey") and not victim:HasTag("hostile")) or victim:HasTag("veggie") or victim:HasTag("structure") or victim:HasTag("wall") or victim:HasTag("companion")) and victim.components.health ~= nil and victim.components.combat ~= nil end This function returns true if the victim is an entity (and therefore not nil), if the victim is not prey (small creature), a vegetable, a wall, or companion pets. The victim also needs to have a health and a combat component. If this returns true, then Wigfrid will go through and call: if not victim.components.health.nofadeout and (victim:HasTag("epic") or math.random() < .1) then local time = victim.components.health.destroytime or 2 local x, y, z = victim.Transform:GetWorldPosition() local scale = (victim:HasTag("smallcreature") and smallScale) or (victim:HasTag("largecreature") and largeScale) or medScale inst:DoTaskInTime(time, spawnspirit, x, y, z, scale) end So if the victim doesn't have nofadeout (default is false), and the victim is a giant (entity with epic tag), or the victim isn't a giant but there's a 10% chance to happen anyways, then a ghostly appearance will spawn over the victim. You know, that ectoplasm white thing that sometimes appears when you kill stuff. Makes sense to have it sometimes for stuff you kill a lot (spiders) and always for stuff you sometimes kill (giants). And yes, your code would work. You can even reduce it to: local function onkilled(inst, data) local victim = data.victim if victim and victim:HasTag("shadowcreature") then inst.components.sanity:DoDelta(victim.sanityreward or TUNING.SANITY_SMALL) end end Because we know that stuff with "shadowcreature" tag most likely passes the IsValidVictim test. Just check for a nil just in case. And also remember to add the ListenForEvent in the master_postinit of your character. Link to comment https://forums.kleientertainment.com/forums/topic/80136-function-to-detect-what-is-killed/#findComment-934711 Share on other sites More sharing options...
RinShigure Posted June 25, 2017 Author Share Posted June 25, 2017 @DarkXero Really thank you for your help, i did understand the function that shows the soul of the victim but i really appreciate your explanation, and i like the way you did it, i'll try it out as soon as i can. Just got a little doubt with the "~" character i havent seen this character in any languages i have used, what is it for?? Link to comment https://forums.kleientertainment.com/forums/topic/80136-function-to-detect-what-is-killed/#findComment-934721 Share on other sites More sharing options...
Leonardo Cox Posted June 25, 2017 Share Posted June 25, 2017 ~= means "not equal" Link to comment https://forums.kleientertainment.com/forums/topic/80136-function-to-detect-what-is-killed/#findComment-934728 Share on other sites More sharing options...
RinShigure Posted June 25, 2017 Author Share Posted June 25, 2017 @DarkKingBoo ohh thanks for the info, i really apreciate it. Link to comment https://forums.kleientertainment.com/forums/topic/80136-function-to-detect-what-is-killed/#findComment-934729 Share on other sites More sharing options...
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