Thanks you for your answer. Yes that's exactly object tried T call nill in NULL. Here's the function associated with a collision trigger so you can see what I'm doing : function Trap.SpikeTrapDmg(character, object) print("collision with " .. character:toString() .. " and " .. object:toString()); if object:getModData()['isTrap'] == 'true' and object:getModData()['trapId'] == "SpikeTrap" then local charstr = character:toString(); local str = "zombie.characters.IsoZombie"; local pstr = "zombie.characters.IsoGameCharacter "; -- zed if charstr:sub(1, str:len()) == str then --print(character:getHealth()); --character:setHealth(0); --if character:getHealth() == 0 then --character:setOnFloor(true); character:say("HAAAAA"); character:Kill(nil); -- getSpecificPlayer does not increase kill count --local weapon_effect = HandWeapon.new("Base", "Hammer", "Weapon", "Hammer"); --character:Hit(weapon_effect, getSpecificPlayer(0), 0,0,0); getSpecificPlayer(0):setZombieKills(getSpecificPlayer(0):getZombieKills() + 1); -- what happens is 2 zombies die at the same time ? need a lock Trap.destroyed(object); --end --- player does not trigger collision like zeds ? elseif charstr:sub(1, pstr:len()) == pstr then print("collision perso"); character:Say("Collision !"); --print("with player"); end endendEvents.OnObjectCollide.Add(Trap.SpikeTrapDmg);character:say("HAAAAA"); character:Hit(...) Don't work but Kill does. I have the same problem with destroying the trap (to make a sound like with a hammer, a hit fails, but the remove of the object works, and I use the playsound(breakdoor) ...). The first print (who collide with what) does not appear when it's me walking on the trap (it doesn't block all the square and i can go through it). The way I store stuff when creating any trap, in the parent file Trap.lua (each trap derives it) : function Trap:create(x, y, z, north, sprite) local cell = getWorld():getCell(); self.sq = cell:getGridSquare(x, y, z); self.javaObject = IsoThumpable.new(cell, self.sq, sprite, north, self); buildUtil.setInfo(self.javaObject, self); buildUtil.consumeMaterial(self); self.javaObject:setMaxHealth(self:getHealth()); self.javaObject:setBreakSound("breakdoor"); self.sq:AddSpecialObject(self.javaObject); if self.javaObject:getModData()["trapId"] == "SpikeTrap" then self.javaObject:getModData()['id'] = #trapping.spikeTrapsList + 1; table.insert(trapping.spikeTrapsList, self.javaObject); else self.javaObject:getModData()['id'] = #trapping.trapsList + 1; table.insert(trapping.trapsList, self.javaObject); endendAnd trapping.trapsList and spikeTrapList are in a trapping.lua file (used to load textures, loading on save load etc) : trapping = {};trapping.trapsList = {};trapping.spikeTrapsList = {};One more question : I remove the IsoThumpable trap using : local square = trap:getSquare();square:RemoveTileObject(trap);And not the method from the super class : ISBuildingObject.removeFromGround(square);Since the super look through all objects and maybe it can remove something else ? (on top of being slower ?) Well for now it kills zombies, produces a breakdoor sound, and an attract zombie sound of radius 10. Id's like to do small damages instead - but the collision trigger 100 times per second - and kill myself walking on it too.