mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-21 12:02:31 +01:00
Possible fix for highlander
TS Fix Law Maker Incendiary Fix Possible Lawgiver burstfire fix Lawgiver Changes: Fix Rapid Fire Add Armor Piercing Add Pellets Lawgiver: Nerf incendiary bullets Blow up the users weapon arm if his dna doesnt match Added a proper soundeffect Added Changelog. Closes #71, Closes #327 Make the lawgiver emagable and change stun to a beam Added crowdcontrol mode to the lawgiver Final Tweaks to the lawgiver Updated .gitignore to inclode the .atom-build.json Fixed indentation Fixed blowing up the wrong hand if the user switch hands after the killswitch has been triggered
This commit is contained in:
@@ -385,14 +385,12 @@ datum/projectile_data
|
||||
|
||||
/proc/projectile_trajectory(var/src_x, var/src_y, var/rotation, var/angle, var/power)
|
||||
|
||||
// returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle],
|
||||
// rotated at [rotation] and with the power of [power]
|
||||
// Thanks to VistaPOWA for this function
|
||||
|
||||
var/g = 9.81
|
||||
var/h = 10
|
||||
var/power_x = power * cos(angle)
|
||||
var/power_y = power * sin(angle)
|
||||
var/time = 2* power_y / 10 //10 = g
|
||||
|
||||
// var/time = 2* power_y / 10 //10 = g
|
||||
var/time = (power_x + sqrt((power_x*power_x)+(2*g*h)))/g
|
||||
var/distance = time * power_x
|
||||
|
||||
var/dest_x = src_x + distance*sin(rotation);
|
||||
|
||||
@@ -35,6 +35,8 @@ var/datum/antagonist/highlander/highlanders
|
||||
for (var/obj/item/I in player)
|
||||
if (istype(I, /obj/item/weapon/implant))
|
||||
continue
|
||||
if (istype(I, /obj/item/organ))
|
||||
continue
|
||||
qdel(I)
|
||||
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(player), slot_w_uniform)
|
||||
@@ -65,4 +67,4 @@ var/datum/antagonist/highlander/highlanders
|
||||
highlanders.add_antagonist(H.mind)
|
||||
|
||||
message_admins("\blue [key_name_admin(usr)] used THERE CAN BE ONLY ONE!", 1)
|
||||
log_admin("[key_name(usr)] used there can be only one.")
|
||||
log_admin("[key_name(usr)] used there can be only one.")
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
msg_admin_attack("[key_name_admin(M)] stungloved [src.name] ([src.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>)")
|
||||
|
||||
var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
|
||||
apply_effects(5,5,0,0,5,0,0,armorblock)
|
||||
apply_effects(5,5,0,0,5,0,0,0,0,armorblock)
|
||||
apply_damage(rand(5,25), BURN, M.zone_sel.selecting,armorblock)
|
||||
|
||||
if(prob(15))
|
||||
|
||||
@@ -61,11 +61,14 @@
|
||||
eye_blurry = max(eye_blurry,(effect/(blocked+1)))
|
||||
if(DROWSY)
|
||||
drowsyness = max(drowsyness,(effect/(blocked+1)))
|
||||
if(INCINERATE)
|
||||
adjust_fire_stacks(effect/(blocked+1))
|
||||
IgniteMob()
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0)
|
||||
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/incinerate = 0, var/blocked = 0)
|
||||
if(blocked >= 2) return 0
|
||||
if(stun) apply_effect(stun, STUN, blocked)
|
||||
if(weaken) apply_effect(weaken, WEAKEN, blocked)
|
||||
@@ -75,4 +78,5 @@
|
||||
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
|
||||
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
|
||||
if(agony) apply_effect(agony, AGONY, blocked)
|
||||
if(incinerate) apply_effect(incinerate, INCINERATE, blocked)
|
||||
return 1
|
||||
|
||||
@@ -1,94 +1,181 @@
|
||||
/obj/item/weapon/gun/energy/lawgiver
|
||||
name = "Lawgiver Mk II"
|
||||
desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
|
||||
icon_state = "lawgiver"
|
||||
item_state = "gun"
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
fire_delay = 3
|
||||
recoil = 1
|
||||
|
||||
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
origin_tech = "combat=6;magnets=5"
|
||||
projectile_type=/obj/item/projectile/bullet/pistol
|
||||
fire_sound='sound/weapons/Gunshot_smg.ogg'
|
||||
sel_mode = 1
|
||||
desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
|
||||
var/dna = null//dna-locking the firearm
|
||||
var/emagged = 0 //if the gun is emagged or not
|
||||
var/owner_name = null //Name of the (initial) owner
|
||||
var/message = null //Message that should be played to the user
|
||||
var/message_delay = 100 //Delay of the message_delay
|
||||
var/message_enabled = 0 //If playing the message should be enabled
|
||||
var/message_disable = 0 //If the loop should be stopped
|
||||
var/default_desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
|
||||
|
||||
var/ammomode = 0
|
||||
var/dna //dna-locking the firearm
|
||||
firemodes = list(
|
||||
list(
|
||||
name="singleshot",
|
||||
charge_cost=50,
|
||||
fire_delay=3,
|
||||
recoil=1
|
||||
),
|
||||
list(
|
||||
name="rapidfire",
|
||||
charge_cost=150,
|
||||
fire_delay=3,
|
||||
recoil=1,
|
||||
burst=3,
|
||||
move_delay=4,
|
||||
accuracy = list(0,-1,-1,-2,-2),
|
||||
dispersion = list(0.0, 0.6, 1.0)
|
||||
),
|
||||
list(
|
||||
name="highex",
|
||||
charge_cost=300,
|
||||
fire_delay=6,
|
||||
recoil=3
|
||||
),
|
||||
list(
|
||||
name="stun",
|
||||
charge_cost=50,
|
||||
fire_delay=4,
|
||||
recoil=0
|
||||
),
|
||||
list(
|
||||
name="hotshot",
|
||||
charge_cost=200,
|
||||
fire_delay=4,
|
||||
recoil=3
|
||||
),
|
||||
list(
|
||||
name="armorpiercing",
|
||||
charge_cost=300,
|
||||
fire_delay=6,
|
||||
recoil=3
|
||||
),
|
||||
list(
|
||||
name="pellets",
|
||||
charge_cost=300,
|
||||
fire_delay=6,
|
||||
recoil=3
|
||||
),
|
||||
)
|
||||
|
||||
proc/hear(message, source as mob)
|
||||
/obj/item/weapon/gun/energy/lawgiver/proc/play_message()
|
||||
while (message_enabled && !message_disable) //Shut down command issued. Inform user that boardcasting has been stopped
|
||||
usr.audible_message("<span class='warning'>[usr]'s [src.name] broadcasts: [message]</span>","")
|
||||
playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
|
||||
sleep(message_delay)
|
||||
usr << "\red Broadcasting Message disabled"
|
||||
message_enabled = 0
|
||||
message_disable = 0
|
||||
|
||||
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/living/carbon/user as mob)
|
||||
if(dna != null)
|
||||
return
|
||||
else
|
||||
src.dna = user.dna.unique_enzymes
|
||||
src.owner_name = user.real_name
|
||||
user << "\blue You feel your palm heat up as the gun reads your DNA profile."
|
||||
desc += "<br>Linked to: [user.real_name]"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/lawgiver/attack_self(mob/user)
|
||||
if(dna != null)
|
||||
return
|
||||
else
|
||||
src.dna = user.dna.unique_enzymes
|
||||
user << "\blue You feel your palm heat up as the gun reads your DNA profile."
|
||||
desc += "<br>Linked to: [user.real_name]"
|
||||
|
||||
Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
|
||||
if(src.dna != user.dna.unique_enzymes)
|
||||
/obj/item/weapon/gun/energy/lawgiver/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
|
||||
if(src.dna != user.dna.unique_enzymes && !emagged)
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
//Save the users active hand
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/organ/external/LA = H.get_organ("l_arm")
|
||||
var/obj/item/organ/external/RA = H.get_organ("r_arm")
|
||||
var/active_hand = H.hand
|
||||
playsound(user, 'sound/weapons/lawgiver_idfail.ogg', 40, 1)
|
||||
user << "\red You hear a soft beep from the gun and 'ID FAIL' flashes across the screen."
|
||||
playsound(user, 'sound/weapons/smg_empty_alarm.ogg', 40, 1)
|
||||
user << "<span class='danger'>[src] blows up in your face!</span>"
|
||||
explosion(get_turf(user), 0, 0, 1, rand(1,2))
|
||||
user << "<span class='danger'>You feel a tiny prick in your hand!</span>"
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return 0
|
||||
//Blow up Unauthorized Users Hand
|
||||
sleep(60)
|
||||
if(active_hand)
|
||||
LA.droplimb(0,DROPLIMB_BLUNT)
|
||||
else
|
||||
RA.droplimb(0,DROPLIMB_BLUNT)
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/energy/lawgiver/proc/Emag(mob/user as mob)
|
||||
usr << "<span class='warning'>You short out [src]'s id check</span>"
|
||||
emagged = 1
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/gun/energy/lawgiver/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/card/emag) && !emagged)
|
||||
Emag(user)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
hear_talk(mob/living/M in range(0,src), msg)
|
||||
/obj/item/weapon/gun/energy/lawgiver/hear_talk(mob/living/M in range(0,src), msg)
|
||||
if( (src.dna==usr.dna.unique_enzymes || emagged) && (src in usr.contents))
|
||||
hear(msg)
|
||||
return
|
||||
return
|
||||
|
||||
hear(var/msg)
|
||||
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = ""," " = "")
|
||||
msg = sanitize_old(msg, replacechars)
|
||||
if(findtext(msg,"singleshot") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
|
||||
ammomode = 0
|
||||
charge_cost = 50
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
usr << "\red [src.name] is now set to single shot mode."
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
fire_delay = 3
|
||||
burst_delay = 0
|
||||
recoil = 1
|
||||
else if(findtext(msg,"rapidfire") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
|
||||
ammomode = 1
|
||||
charge_cost = 50
|
||||
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
usr << "\red [src.name] is now set to rapid fire mode."
|
||||
projectile_type = /obj/item/projectile/bullet/pistol
|
||||
fire_delay = 1
|
||||
burst_delay = 0
|
||||
recoil = 2
|
||||
else if(findtext(msg,"highex") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
|
||||
ammomode = 2
|
||||
charge_cost = 200
|
||||
fire_sound = 'sound/effects/Explosion1.ogg'
|
||||
usr << "\red [src.name] is now set to high explosive mode."
|
||||
projectile_type = /obj/item/projectile/bullet/gyro/law
|
||||
fire_delay = 6
|
||||
burst_delay = 0
|
||||
recoil = 3
|
||||
else if(findtext(msg,"stun") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
|
||||
ammomode = 3
|
||||
charge_cost = 50
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
usr << "\red [src.name] is now set to stun mode."
|
||||
projectile_type = /obj/item/projectile/energy/electrode
|
||||
fire_delay = 4
|
||||
burst_delay = 0
|
||||
recoil = 0
|
||||
else if(findtext(msg,"hotshot") && (src.dna==usr.dna.unique_enzymes) && (src in usr.contents))
|
||||
ammomode = 4
|
||||
charge_cost = 200
|
||||
fire_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
usr << "\red [src.name] is now set to incendiary mode."
|
||||
projectile_type = /obj/item/projectile/bullet/shotgun
|
||||
fire_delay = 6
|
||||
burst_delay = 0
|
||||
recoil = 1
|
||||
else
|
||||
/obj/item/weapon/gun/energy/lawgiver/proc/hear(var/msg)
|
||||
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = ""," " = "")
|
||||
msg = sanitize_old(msg, replacechars)
|
||||
/* Firing Modes*/
|
||||
if(findtext(msg,"single"))
|
||||
sel_mode = 1
|
||||
projectile_type=/obj/item/projectile/bullet/pistol
|
||||
fire_sound='sound/weapons/Gunshot_smg.ogg'
|
||||
usr << "\red [src.name] is now set to single shot mode."
|
||||
else if(findtext(msg,"rapidfire"))
|
||||
sel_mode = 2
|
||||
projectile_type=/obj/item/projectile/bullet/pistol
|
||||
fire_sound='sound/weapons/Gunshot_smg.ogg'
|
||||
usr << "\red [src.name] is now set to rapid fire mode."
|
||||
else if(findtext(msg,"highex") || findtext(msg,"grenade"))
|
||||
sel_mode = 3
|
||||
projectile_type=/obj/item/projectile/bullet/gyro/law
|
||||
fire_sound='sound/effects/Explosion1.ogg'
|
||||
usr << "\red [src.name] is now set to high explosive mode."
|
||||
else if(findtext(msg,"stun"))
|
||||
sel_mode = 4
|
||||
projectile_type=/obj/item/projectile/beam/stun
|
||||
fire_sound='sound/weapons/Taser.ogg'
|
||||
usr << "\red [src.name] is now set to stun mode."
|
||||
else if(findtext(msg,"hotshot") || findtext(msg,"incendiary"))
|
||||
sel_mode = 5
|
||||
projectile_type=/obj/item/projectile/bullet/shotgun/incendiary
|
||||
fire_sound='sound/weapons/Gunshot.ogg'
|
||||
usr << "\red [src.name] is now set to incendiary mode."
|
||||
else if(findtext(msg,"armorpiercing") || findtext(msg,"execution"))
|
||||
sel_mode = 6
|
||||
projectile_type=/obj/item/projectile/bullet/rifle/a556
|
||||
fire_sound='sound/weapons/Gunshot.ogg'
|
||||
usr << "\red [src.name] is now set to armorpiercing mode."
|
||||
else if(findtext(msg,"pellets"))
|
||||
sel_mode = 7
|
||||
projectile_type=/obj/item/projectile/bullet/pellet/shotgun
|
||||
fire_sound='sound/weapons/Gunshot.ogg'
|
||||
usr << "\red [src.name] is now set to pellet mode."
|
||||
/* Other Stuff */
|
||||
else if(findtext(msg,"reset") && (findtext(msg,"user") || findtext(msg,"dna")))
|
||||
dna = null
|
||||
desc = default_desc
|
||||
usr << "\red [src.name]´s owner has been reset. Do not attempt to fire [src.name] without rebinding a new owner"
|
||||
else if((findtext(msg,"disable") || findtext(msg,"deactivate")) && findtext(msg,"crowdcontrol"))
|
||||
message_disable = 1
|
||||
usr << "\red [src.name]´s crowdcontrol deactivation sequence started"
|
||||
else if((findtext(msg,"enable") || findtext(msg,"activate")) && findtext(msg,"crowdcontrol"))
|
||||
if(message_enabled) //Check if a message is already broadcasting -> abort
|
||||
usr << "\red [src.name] is already broadcasting a message."
|
||||
return
|
||||
usr << "\red [src.name]´s crowdcontrol activation sequence started"
|
||||
message = "Citizens stay calm. Stand back from the crimescense. Interference with the crimescene carries an automatice brig sentence."
|
||||
message_enabled = 1
|
||||
message_disable = 0
|
||||
play_message()
|
||||
else
|
||||
return
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
var/eyeblur = 0
|
||||
var/drowsy = 0
|
||||
var/agony = 0
|
||||
var/incinerate = 0
|
||||
var/embed = 0 // whether or not the projectile can embed itself in the mob
|
||||
|
||||
var/hitscan = 0 // whether the projectile should be hitscan
|
||||
@@ -77,7 +78,7 @@
|
||||
if(!isliving(target)) return 0
|
||||
if(isanimal(target)) return 0
|
||||
var/mob/living/L = target
|
||||
L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
|
||||
L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, incinerate, blocked) // add in AGONY!
|
||||
return 1
|
||||
|
||||
//called when the projectile stops flying because it collided with something
|
||||
|
||||
@@ -130,6 +130,15 @@
|
||||
embed = 0
|
||||
sharp = 0
|
||||
|
||||
/obj/item/projectile/bullet/shotgun/incendiary
|
||||
name = "incendiary"
|
||||
check_armour = "melee"
|
||||
damage = 5
|
||||
agony = 0
|
||||
embed = 0
|
||||
sharp = 0
|
||||
incinerate = 10
|
||||
|
||||
//Should do about 80 damage at 1 tile distance (adjacent), and 50 damage at 3 tiles distance.
|
||||
//Overall less damage than slugs in exchange for more damage at very close range and more embedding
|
||||
/obj/item/projectile/bullet/pellet/shotgun
|
||||
|
||||
@@ -413,6 +413,7 @@
|
||||
#define STUTTER "stutter"
|
||||
#define EYE_BLUR "eye_blur"
|
||||
#define DROWSY "drowsy"
|
||||
#define INCINERATE "incinerate"
|
||||
|
||||
// I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches.
|
||||
#define BRUTELOSS 1
|
||||
|
||||
Reference in New Issue
Block a user