TTT Remote Detonator for Traitors not working as it should
9 replies, posted
So I have this remote detonator swep that is suppose to be placeable on living and dead players and also on health stations. It won't detonate at all after you place it a health station. When you detonate it on a living or dead player, it does not damage players or make props move like an explosion is suppose to do. You can see the explosion, but the damage doesn't register.
Code is below, you can also view it via pastebin: [url]http://pastebin.com/e4sQynXx[/url]
The file name on the server is "weapon_ttt_rdetonate.lua"
[CODE]if SERVER then AddCSLuaFile()
end
SWEP.HoldType = "slam"
SWEP.PrintName = "Remote Detonator"
if CLIENT then
SWEP.Slot = 6
SWEP.ViewModelFOV = 10
SWEP.EquipMenuData = {
type = "item_weapon",
desc = "Primary: Plant bomb on player or\na corpse.\n\nSecondary: Trigger explosive."
};
SWEP.Icon = "VGUI/ttt/icon_splode"
end
SWEP.Base = "weapon_tttbase"
SWEP.ViewModel = "models/weapons/v_crowbar.mdl"
SWEP.WorldModel = "models/weapons/w_defuser.mdl"
SWEP.DrawCrosshair = false
SWEP.Secondary.Damage = 400
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = true
SWEP.Primary.Delay = 0.15
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = true
SWEP.Secondary.Ammo = "none"
SWEP.Secondary.Delay = 0.1
SWEP.Kind = WEAPON_EQUIP
SWEP.CanBuy = {ROLE_TRAITOR} -- only traitors can buy
SWEP.WeaponID = AMMO_DEFUSER
SWEP.LimitedStock = true -- only buyable once
--SWEP.AllowDrop = false
local sou = Sound("Weapon_TMP.Clipin")
local sou2 = Sound("Default.PullPin_Grenade")
local function tWarn(ent,armed)
umsg.Start("c4_warn", GetTraitorFilter(true))
umsg.Short(ent:EntIndex())
umsg.Bool(armed)
umsg.Vector(ent:GetPos())
umsg.Float(0)
umsg.End()
end
function SWEP:PrimaryAttack()
if not IsValid(self.Owner) then return end
self.Weapon:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
if self.attach then return false end
if SERVER and self.Owner:GetNWBool('disguised',false) == true and string.len(self.Owner:GetNWString('disgas','')) > 0 then self.Owner:ConCommand('ttt_set_disguise 0') end
if SERVER and _rdm then
local stid = self.Owner:SteamID()
if not _rdm.shotsFired[stid] then _rdm.shotsFired[stid] = {} end
table.insert(_rdm.shotsFired[stid],CurTime())
end
if SERVER and ShootLog then ShootLog(Format("WEAPON:\t %s [%s] planted a %s", self.Owner:Nick(), self.Owner:GetRoleString(), self.Weapon:GetClass())) end
local spos = self.Owner:GetShootPos()
local sdest = spos + (self.Owner:GetAimVector() * 120)
if self.Owner.LagCompensation then -- for some reason not always true
self.Owner:LagCompensation(true)
end
local tr = util.TraceLine({start=spos, endpos=sdest, filter=self.Owner, mask=MASK_SHOT})
if not tr.Entity or not IsValid(tr.Entity) then return end
if IsValid(tr.Entity) and tr.Entity:GetClass() == "player" then
if SERVER then
local ply = tr.Entity
if not self.attach then
self.attach = ply:UniqueID()
self.atype = 'ply'
sound.Play(sou,ply:GetPos(),40)
if tWarn then tWarn(ply,true) end
end
end
elseif IsValid(tr.Entity) and tr.Entity:GetClass() == "prop_ragdoll" and tr.Entity.player_ragdoll then
if SERVER then
local rag = tr.Entity
if not self.attach then
self.attach = rag.uqid
self.atype = 'rag'
sound.Play(sou,rag:GetPos(),40)
if tWarn then tWarn(rag,true) end
end
end
elseif IsValid(tr.Entity) and tr.Entity:GetClass() == 'ttt_health_station' then
if SERVER then
tr.toexp = self.Owner
self.attach = tr.Entity:EntIndex()
self.atype = 'hs'
sound.Play(sou,tr.Entity:GetPos(),40)
if tWarn then tWarn(tr.Entity,true) end
end
end
if self.attach then
self.planted = CurTime()
self.Owner:ChatPrint("Planted!")
self.Owner:AnimPerformGesture(ACT_GMOD_GESTURE_ITEM_GIVE)
end
self.Weapon:SetNextPrimaryFire( CurTime() + (self.Primary.Delay * 2) )
if self.Owner.LagCompensation then
self.Owner:LagCompensation(false)
end
end
function SWEP:Detonate(v,t)
if SERVER and self.Owner:GetNWBool('disguised',false) == true and string.len(self.Owner:GetNWString('disgas','')) > 0 then self.Owner:ConCommand('ttt_set_disguise 0') end
if SERVER and _rdm then
local stid = self.Owner:SteamID()
if not _rdm.shotsFired[stid] then _rdm.shotsFired[stid] = {} end
table.insert(_rdm.shotsFired[stid],CurTime())
end
if SERVER and ShootLog then ShootLog(Format("WEAPON:\t %s [%s] detonated a %s", self.Owner:Nick(), self.Owner:GetRoleString(), self.Weapon:GetClass())) end
local pos = v:GetPos()
local effect = EffectData()
effect:SetStart(pos)
effect:SetOrigin(pos)
local rad = 50
local dmg = 50
effect:SetScale(rad * 0.2)
effect:SetRadius(rad)
effect:SetMagnitude(dmg)
util.Effect("Explosion", effect, true, true)
local ent = ents.Create("weapon_ttt_rdetonate")
util.BlastDamage(ent,self.Owner,pos,rad,dmg)
ent:Remove()
end
function SWEP:SecondaryAttack()
if SERVER then
if self.planted and CurTime()-self.planted < 1 then return end
if self.attach and self.attach != -1 then
if self.atype == 'hs' then
for k,v in pairs(ents.FindByClass('ttt_new_hp')) do
if v:EntIndex() == self.attach then
self.attach = -1
sound.Play(Sound("Default.PullPin_Grenade"),v:GetPos())
--timer.Simple(2, function()
if tWarn then tWarn(v,false) end
self:Detonate(v,1)
self:Remove()
--end)
break
end
end
else
for _, v in ipairs( player.GetAll() ) do
if v:UniqueID() == self.attach then
if not v:Alive() then
for _, v2 in ipairs( ents.FindByClass("prop_ragdoll") ) do
if IsValid(v2) then
if v2.player_ragdoll and v2.uqid == self.attach then
self.attach = -1
sound.Play(sou2,v2:GetPos())
--timer.Simple(2, function()
if tWarn then tWarn(v,false) tWarn(v2,false) end
self:Detonate(v2,1)
Any help would be appreciated, even if it only solves a small part of this problem. Also if any other information is needed, just ask.
Explosions can be tricky if not done right. Odd effects can occur like no damage, etc... Magnitude is limited to 100 per explosion, but they stack.. Take a look at my code: [url]https://bitbucket.org/Acecool/acecooldev_base/src/160f40f48be46367b3b98c905ed4a0fb4c5819c4/gamemode/server/core/util_createexplosion.lua?at=master[/url]
Makes things easier, handles magnitude and blast damage. When you place the bomb on something, I'd recommend enabling a tracker on your swep to track the pos. When detonated, get the tracked entity position ( when you place it, just set a var like tracked = target entity ) and move the explosion up 16 units or so ( 1 foot ). The explosion could be happening underground.
weapon_ttt_rdetonator.lua
if SERVER then AddCSLuaFile( "shared.lua" )
end
Change AddCSLuaFile("shared.lua") to AddCSLuaFile()
Ok, I passed on this information to the person who made it. He said "I might just need to make a entity file for it. Which takes like 5 minutes." Would this fix our problems with the SWEP or would he still need to look at what Acecool mentioned?
Also thanks Sm63, for noticing that.
[QUOTE=Actowolfy;46005687]Ok, I passed on this information to the person who made it. He said "I might just need to make a entity file for it. Which takes like 5 minutes." Would this fix our problems with the SWEP or would he still need to look at what Acecool mentioned?
Also thanks Sm63, for noticing that.[/QUOTE]
Could you tell me, who made it? I need to confirm something, this is a little offtopic, but I need to know what you know.
[QUOTE=Actowolfy;46005687]Ok, I passed on this information to the person who made it. He said "I might just need to make a entity file for it. Which takes like 5 minutes." Would this fix our problems with the SWEP or would he still need to look at what Acecool mentioned?
Also thanks Sm63, for noticing that.[/QUOTE]
He actually didn't make it. It must have been stolen off of my server.
You can use it though. I don't mind but don't let him lie to you and definitely don't give him any money for it.
EDIT:
To fix it, change "local ent = ents.Create("weapon_ttt_remote")" to "local ent = ents.Create("weapon_ttt_rdetonate")"
[QUOTE=Sm63;46009180]Could you tell me, who made it? I need to confirm something, this is a little offtopic, but I need to know what you know.[/QUOTE]
It was "made" by a mod on our server.
[QUOTE=Mitsudigi;46013164]He actually didn't make it. It must have been stolen off of my server.
You can use it though. I don't mind but don't let him lie to you and definitely don't give him any money for it.
EDIT:
To fix it, change "local ent = ents.Create("weapon_ttt_remote")" to "local ent = ents.Create("weapon_ttt_rdetonate")"[/QUOTE]
You have my apologies if he really did take this from your server without permission. Also thanks for letting us use it.
The error I am getting when I use it is:
[CODE][ERROR] gamemodes/terrortown/entities/weapons/weapon_ttt_rdetonator.lua:139: Tried to use a NULL entity!
1. BlastDamage - [C]:-1
2. Detonate - gamemodes/terrortown/entities/weapons/weapon_ttt_rdetonator.lua:139
3. unknown - gamemodes/terrortown/entities/weapons/weapon_ttt_rdetonator.lua:183[/CODE]
[QUOTE=Actowolfy;46016409]The error I am getting when I use it is:
...[/QUOTE]
Fixed and cleaned it up for you:
[url]http://pastebin.com/36myDSFw[/url]
[QUOTE=Mitsudigi;46018999]Fixed and cleaned it up for you:
[url]http://pastebin.com/36myDSFw[/url][/QUOTE]
Thank you! It works now. It just needs some slight adjustments in range and damage which is easy enough to do. Also thanks again for fixing this and for your permission to use it even though it is highly likely that our mod took it from you without giving credit.
Sorry, you need to Log In to post a reply to this thread.