Luis95R Posted December 27, 2016 Share Posted December 27, 2016 Hi, I was wondering if anyone knows if its possible to make the deconstruction staff only work on items and not structures? I ask this because people on my server have been griefing with the deconstruction staff. I have the Ownership and Modify Ownership mod, but they don't protect against the deconstruction staff. What I want is for the staff to work only on items and not on structures. Maybe there is a way for it to not work on prefabs with the tag "structure"? I'm not sure how to go about this. If anyone can provide help it would be appreciated. Here is the Deconstruction staff code for reference. -------GREEN STAFF----------- local DESTSOUNDS = { { --magic soundpath = "dontstarve/common/destroy_magic", ing = { "nightmarefuel", "livinglog" }, }, { --cloth soundpath = "dontstarve/common/destroy_clothing", ing = { "silk", "beefalowool" }, }, { --tool soundpath = "dontstarve/common/destroy_tool", ing = { "twigs" }, }, { --gem soundpath = "dontstarve/common/gem_shatter", ing = { "redgem", "bluegem", "greengem", "purplegem", "yellowgem", "orangegem" }, }, { --wood soundpath = "dontstarve/common/destroy_wood", ing = { "log", "boards" }, }, { --stone soundpath = "dontstarve/common/destroy_stone", ing = { "rocks", "cutstone" }, }, { --straw soundpath = "dontstarve/common/destroy_straw", ing = { "cutgrass", "cutreeds" }, }, } local DESTSOUNDSMAP = {} for i, v in ipairs(DESTSOUNDS) do for i2, v2 in ipairs(v.ing) do DESTSOUNDSMAP[v2] = v.soundpath end end DESTSOUNDS = nil local function CheckSpawnedLoot(loot) if not ((loot.components.inventoryitem ~= nil and loot.components.inventoryitem:IsHeld()) or loot:IsOnValidGround()) then SpawnPrefab("splash_ocean").Transform:SetPosition(loot.Transform:GetWorldPosition()) if loot:HasTag("irreplaceable") then loot.Transform:SetPosition(FindSafeSpawnLocation(loot.Transform:GetWorldPosition())) else loot:Remove() end end end local function SpawnLootPrefab(inst, lootprefab) if lootprefab == nil then return end local loot = SpawnPrefab(lootprefab) if loot == nil then return end local x, y, z = inst.Transform:GetWorldPosition() if loot.Physics ~= nil then local angle = math.random() * 2 * PI loot.Physics:SetVel(2 * math.cos(angle), 10, 2 * math.sin(angle)) if inst.Physics ~= nil then local len = loot.Physics:GetRadius() + inst.Physics:GetRadius() x = x + math.cos(angle) * len z = z + math.sin(angle) * len end loot:DoTaskInTime(1, CheckSpawnedLoot) end loot.Transform:SetPosition(x, y, z) return loot end local function destroystructure(staff, target) local recipe = AllRecipes[target.prefab] if recipe == nil then --Action filters should prevent us from reaching here normally return end local ingredient_percent = ( (target.components.finiteuses ~= nil and target.components.finiteuses:GetPercent()) or (target.components.fueled ~= nil and target.components.inventoryitem ~= nil and target.components.fueled:GetPercent()) or (target.components.armor ~= nil and target.components.inventoryitem ~= nil and target.components.armor:GetPercent()) or 1 ) / recipe.numtogive --V2C: Can't play sounds on the staff, or nobody -- but the user and the host will hear them! local caster = staff.components.inventoryitem.owner for i, v in ipairs(recipe.ingredients) do if caster ~= nil and DESTSOUNDSMAP[v.type] ~= nil then caster.SoundEmitter:PlaySound(DESTSOUNDSMAP[v.type]) end if string.sub(v.type, -3) ~= "gem" or string.sub(v.type, -11, -4) == "precious" then --V2C: always at least one in case ingredient_percent is 0% local amt = math.max(1, math.ceil(v.amount * ingredient_percent)) for n = 1, amt do SpawnLootPrefab(target, v.type) end end end if caster ~= nil then caster.SoundEmitter:PlaySound("dontstarve/common/staff_dissassemble") if caster.components.sanity ~= nil then caster.components.sanity:DoDelta(-TUNING.SANITY_MEDLARGE) end end staff.components.finiteuses:Use(1) if target.components.inventory ~= nil then target.components.inventory:DropEverything() end if target.components.container ~= nil then target.components.container:DropEverything() end if target.components.spawner ~= nil and target.components.spawner:IsOccupied() then target.components.spawner:ReleaseChild() end if target.components.occupiable ~= nil and target.components.occupiable:IsOccupied() then local item = target.components.occupiable:Harvest() if item ~= nil then item.Transform:SetPosition(target.Transform:GetWorldPosition()) item.components.inventoryitem:OnDropped() end end if target.components.trap ~= nil then target.components.trap:Harvest() end if target.components.stackable ~= nil then --if it's stackable we only want to destroy one of them. target.components.stackable:Get():Remove() else target:Remove() end end local function HasRecipe(guy) return guy.prefab ~= nil and AllRecipes[guy.prefab] ~= nil end local function onhauntgreen(inst) if math.random() <= TUNING.HAUNT_CHANCE_RARE then local target = FindEntity(inst, 20, HasRecipe, nil, { "INLIMBO" }) if target ~= nil then destroystructure(inst, target) SpawnPrefab("collapse_small").Transform:SetPosition(target.Transform:GetWorldPosition()) inst.components.hauntable.hauntvalue = TUNING.HAUNT_LARGE return true end end return false end also this: local function green() local inst = commonfn("green", { "nopunch" }) if not TheWorld.ismastersim then return inst end inst.fxcolour = {51/255,153/255,51/255} inst:AddComponent("spellcaster") inst.components.spellcaster.canuseontargets = true inst.components.spellcaster.canonlyuseonrecipes = true inst.components.spellcaster:SetSpellFn(destroystructure) inst.components.finiteuses:SetMaxUses(TUNING.GREENSTAFF_USES) inst.components.finiteuses:SetUses(TUNING.GREENSTAFF_USES) MakeHauntableLaunch(inst) AddHauntableCustomReaction(inst, onhauntgreen, true, false, true) return inst end Link to comment Share on other sites More sharing options...
Cyberboy2000 Posted December 27, 2016 Share Posted December 27, 2016 Um, what kind of server are you playing on where people grief with the fricken deconstruction staff of all things? Do you just have spare staves lying around for people to take? Link to comment Share on other sites More sharing options...
Luis95R Posted December 28, 2016 Author Share Posted December 28, 2016 21 hours ago, Cyberboy2000 said: Um, what kind of server are you playing on where people grief with the fricken deconstruction staff of all things? Do you just have spare staves lying around for people to take? A server that's been going on for 9,000+ days. Link to comment Share on other sites More sharing options...
Aquaterion Posted December 28, 2016 Share Posted December 28, 2016 (edited) --change this: if recipe == nil then --Action filters should prevent us from reaching here normally return end --to this: if recipe == nil or target:HasTag("structure") then --Action filters should prevent us from reaching here normally return end Edited December 28, 2016 by Aquaterion Link to comment Share on other sites More sharing options...
Luis95R Posted December 28, 2016 Author Share Posted December 28, 2016 6 hours ago, Aquaterion said: --change this: if recipe == nil then --Action filters should prevent us from reaching here normally return end --to this: if recipe == nil or target:HasTag("structure") then --Action filters should prevent us from reaching here normally return end It works perfect, thanks! I was afraid I would have to disable the staff completely. Link to comment 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