From 38bf529f3c072f5c95c4077a2f14d99ee4308a5e Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 11 Jun 2020 20:18:36 +0100
Subject: [PATCH] a tonne of fixes
---
code/__DEFINES/dcs/signals.dm | 2 +-
code/__DEFINES/is_helpers.dm | 2 +-
code/_globalvars/traits.dm | 1 -
code/datums/components/embedded.dm | 2 +-
code/datums/components/pellet_cloud.dm | 12 ++++--------
code/datums/elements/embed.dm | 2 +-
code/game/gamemodes/gangs/gang_items.dm | 2 +-
code/game/objects/effects/mines.dm | 4 ++--
code/game/objects/items.dm | 2 +-
code/game/objects/items/grenades/flashbang.dm | 8 ++++----
code/game/objects/items/grenades/grenade.dm | 2 +-
code/game/objects/items/grenades/syndieminibomb.dm | 4 ++--
code/game/objects/items/shrapnel.dm | 10 +++++-----
code/game/objects/items/twohanded.dm | 4 ++--
code/game/objects/objs.dm | 2 +-
.../bloodsucker/items/bloodsucker_stake.dm | 2 +-
code/modules/cargo/packs/security.dm | 3 ---
code/modules/mob/living/carbon/carbon.dm | 4 ++--
code/modules/mob/living/carbon/carbon_defense.dm | 2 +-
.../modules/mob/living/carbon/human/human_defense.dm | 5 -----
code/modules/mob/living/living_defense.dm | 2 +-
code/modules/paperwork/pen.dm | 2 +-
code/modules/projectiles/ammunition/ballistic/lmg.dm | 4 ++--
.../projectiles/ammunition/ballistic/revolver.dm | 8 ++++----
.../projectiles/boxes_magazines/ammo_boxes.dm | 11 +++++++++++
code/modules/projectiles/projectile.dm | 4 ++--
.../projectiles/projectile/bullets/revolver.dm | 8 ++++----
.../code/modules/mob/living/carbon/human/human.dm | 2 +-
28 files changed, 57 insertions(+), 59 deletions(-)
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 4d913e38f1..fb0e659330 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -320,7 +320,7 @@
#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
// /obj/item/projectile signals (sent to the firer)
-#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
+#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target)
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 5466e9267b..4b488030a0 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define islandmine(A) (istype(A, /obj/effect/mine))
-#define isammocasing(A) (istype(A, /obj/i
+#define isammocasing(A) (istype(A, /obj/item/ammo_casing))
#define isidcard(I) (istype(I, /obj/item/card/id))
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 1b3a2df782..3c28e50ea3 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -93,7 +93,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PASSTABLE" = TRAIT_PASSTABLE,
"TRAIT_GIANT" = TRAIT_GIANT,
"TRAIT_DWARF" = TRAIT_DWARF,
- "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
"TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT,
"TRAIT_COMBAT_MODE_LOCKED" = TRAIT_COMBAT_MODE_LOCKED,
"TRAIT_SPRINT_LOCKED" = TRAIT_SPRINT_LOCKED,
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
index d0159cd4a4..2324b36033 100644
--- a/code/datums/components/embedded.dm
+++ b/code/datums/components/embedded.dm
@@ -269,7 +269,7 @@
var/damage = weapon.w_class * pain_mult
var/chance = pain_chance
- if(pain_stam_pct && victim.stam_paralyzed) //if it's a less-lethal embed, give them a break if they're already stamcritted
+ if(pain_stam_pct && IS_STAMCRIT(victim)) //if it's a less-lethal embed, give them a break if they're already stamcritted
chance *= 0.3
damage *= 0.7
diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm
index 2fc4fd929c..938d9f5f56 100644
--- a/code/datums/components/pellet_cloud.dm
+++ b/code/datums/components/pellet_cloud.dm
@@ -187,7 +187,7 @@
break
///One of our pellets hit something, record what it was and check if we're done (terminated == num_pellets)
-/datum/component/pellet_cloud/proc/pellet_hit(obj/projectile/P, atom/movable/firer, atom/target, Angle)
+/datum/component/pellet_cloud/proc/pellet_hit(obj/item/projectile/P, atom/movable/firer, atom/target, Angle)
pellets -= P
terminated++
hits++
@@ -199,7 +199,7 @@
finalize()
///One of our pellets disappeared due to hitting their max range (or just somehow got qdel'd), remove it from our list and check if we're done (terminated == num_pellets)
-/datum/component/pellet_cloud/proc/pellet_range(obj/projectile/P)
+/datum/component/pellet_cloud/proc/pellet_range(obj/item/projectile/P)
pellets -= P
terminated++
UnregisterSignal(P, list(COMSIG_PARENT_QDELETING, COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT))
@@ -208,7 +208,7 @@
/// Minor convenience function for creating each shrapnel piece with circle explosions, mostly stolen from the MIRV component
/datum/component/pellet_cloud/proc/pew(atom/target, spread=0)
- var/obj/projectile/P = new projectile_type(get_turf(parent))
+ var/obj/item/projectile/P = new projectile_type(get_turf(parent))
//Shooting Code:
P.spread = spread
@@ -225,7 +225,7 @@
///All of our pellets are accounted for, time to go target by target and tell them how many things they got hit by.
/datum/component/pellet_cloud/proc/finalize()
- var/obj/projectile/P = projectile_type
+ var/obj/item/projectile/P = projectile_type
var/proj_name = initial(P.name)
for(var/atom/target in targets_hit)
@@ -238,10 +238,6 @@
target.visible_message("[target] is hit by a [proj_name]!", null, null, COMBAT_MESSAGE_RANGE, target)
to_chat(target, "You're hit by a [proj_name]!")
- for(var/M in purple_hearts)
- var/mob/living/martyr = M
- if(martyr.stat == DEAD && martyr.client)
- martyr.client.give_award(/datum/award/achievement/misc/lookoutsir, martyr)
UnregisterSignal(parent, COMSIG_PARENT_PREQDELETED)
if(queued_delete)
qdel(parent)
diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm
index fd74cc0e7c..0bfeafb4be 100644
--- a/code/datums/elements/embed.dm
+++ b/code/datums/elements/embed.dm
@@ -168,7 +168,7 @@
* If we hit a valid target (carbon or closed turf), we create the shrapnel_type object and immediately call tryEmbed() on it, targeting what we impacted. That will lead
* it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to.
*/
-/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/P, atom/movable/firer, atom/hit)
+/datum/element/embed/proc/checkEmbedProjectile(obj/item/projectile/P, atom/movable/firer, atom/hit)
if(!iscarbon(hit) && !isclosedturf(hit))
Detach(P)
return // we don't care
diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm
index d3ccb5a355..7d6ecd00f6 100644
--- a/code/game/gamemodes/gangs/gang_items.dm
+++ b/code/game/gamemodes/gangs/gang_items.dm
@@ -288,7 +288,7 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m
name = "Fragmentation Grenade"
id = "frag nade"
cost = 5
- item_path = /obj/item/grenade/syndieminibomb/concussion/frag
+ item_path = /obj/item/grenade/frag
/datum/gang_item/equipment/implant_breaker
name = "Implant Breaker"
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index cb0e9ee356..1ee8b1e224 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -53,7 +53,7 @@
/obj/effect/mine/shrapnel
name = "shrapnel mine"
- var/shrapnel_type = /obj/projectile/bullet/shrapnel
+ var/shrapnel_type = /obj/item/projectile/bullet/shrapnel
var/shrapnel_magnitude = 3
/obj/effect/mine/shrapnel/mineEffect(mob/victim)
@@ -61,7 +61,7 @@
/obj/effect/mine/shrapnel/sting
name = "stinger mine"
- shrapnel_type = /obj/projectile/bullet/pellet/stingball
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball
/obj/effect/mine/kickmine
name = "kick mine"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4982da4520..7a1976c40a 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -107,7 +107,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
mouse_drag_pointer = MOUSE_ACTIVE_POINTER //the icon to indicate this object is being dragged
- var/datum/embedding_behavior/embedding
+ var/list/embedding = NONE
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/heat = 0
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index 19ac820841..2965f98a05 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -72,7 +72,7 @@
- shrapnel_type = /obj/projectile/bullet/pellet/stingball
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball
@@ -96,7 +96,7 @@
- shrapnel_type = /obj/projectile/bullet/pellet/stingball/mega
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/mega
@@ -212,7 +212,7 @@
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
var/rots_per_mag = 3 /// how many times we need to "rotate" the charge in hand per extra tile of magnitude
- shrapnel_type = /obj/projectile/bullet/shrapnel
+ shrapnel_type = /obj/item/projectile/bullet/shrapnel
var/rots = 1 /// how many times we've "rotated" the charge
/obj/item/grenade/primer/attack_self(mob/user)
@@ -233,4 +233,4 @@
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
rots_per_mag = 2
- shrapnel_type = /obj/projectile/bullet/pellet/stingball
+ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball
diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index a2833c77ba..bb99bf3d6e 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -41,7 +41,7 @@
shrapnel_initialized = TRUE
AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius)
playsound(src, 'sound/items/eatfood.ogg', 50, 1)
- SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time, delayoverride)
+ SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time)
preprime(user, det_time)
user.transferItemToLoc(src, user, TRUE)//>eat a grenade set to 5 seconds >rush captain
sleep(det_time)//so you dont die instantly
diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm
index f579120246..ae2877dcaf 100644
--- a/code/game/objects/items/grenades/syndieminibomb.dm
+++ b/code/game/objects/items/grenades/syndieminibomb.dm
@@ -27,7 +27,7 @@
name = "frag grenade"
desc = "An anti-personnel fragmentation grenade, this weapon excels at killing soft targets by shredding them with metal shrapnel."
icon_state = "frag"
- shrapnel_type = /obj/projectile/bullet/shrapnel
+ shrapnel_type = /obj/item/projectile/bullet/shrapnel
shrapnel_radius = 4
ex_heavy = 1
ex_light = 3
@@ -36,7 +36,7 @@
/obj/item/grenade/frag/mega
name = "FRAG grenade"
desc = "An anti-everything fragmentation grenade, this weapon excels at killing anything any everything by shredding them with metal shrapnel."
- shrapnel_type = /obj/projectile/bullet/shrapnel/mega
+ shrapnel_type = /obj/item/projectile/bullet/shrapnel/mega
shrapnel_radius = 12
/obj/item/grenade/frag/prime()
diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm
index cd3436846e..d3ffe62af8 100644
--- a/code/game/objects/items/shrapnel.dm
+++ b/code/game/objects/items/shrapnel.dm
@@ -26,7 +26,7 @@
name = "\improper .38 DumDum bullet"
embedding = list(embed_chance=70, fall_chance=7, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10, embed_chance_turf_mod=-100)
-/obj/projectile/bullet/shrapnel
+/obj/item/projectile/bullet/shrapnel
name = "flying shrapnel shard"
damage = 9
range = 10
@@ -38,7 +38,7 @@
ricochet_incidence_leeway = 60
hit_stunned_targets = TRUE
-/obj/projectile/bullet/shrapnel/mega
+/obj/item/projectile/bullet/shrapnel/mega
name = "flying shrapnel hunk"
range = 25
dismemberment = 10
@@ -46,7 +46,7 @@
ricochet_chance = 90
ricochet_decay_chance = 0.9
-/obj/projectile/bullet/pellet/stingball
+/obj/item/projectile/bullet/pellet/stingball
name = "stingball pellet"
damage = 3
stamina = 8
@@ -59,10 +59,10 @@
ricochet_incidence_leeway = 0
shrapnel_type = /obj/item/shrapnel/stingball
-/obj/projectile/bullet/pellet/stingball/mega
+/obj/item/projectile/bullet/pellet/stingball/mega
name = "megastingball pellet"
ricochets_max = 6
ricochet_chance = 110
-/obj/projectile/bullet/pellet/stingball/on_ricochet(atom/A)
+/obj/item/projectile/bullet/pellet/stingball/on_ricochet(atom/A)
hit_stunned_targets = TRUE // ducking will save you from the first wave, but not the rebounds
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index e44314c5ca..6ad0b789b5 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -667,7 +667,7 @@
force_wielded = 19
force_unwielded = 11
throwforce = 21
- embedding = getEmbeddingBehavior(embed_chance = 75, embedded_pain_multiplier = 1.5) //plasmaglass spears are sharper
+ embedding = list(embed_chance = 75, pain_mult = 1.5) //plasmaglass spears are sharper
icon_prefix = "spearplasma"
qdel(tip)
var/obj/item/twohanded/spear/S = locate() in parts_list
@@ -682,7 +682,7 @@
if(G)
explosive = G
name = "explosive lance"
- embedding = getEmbeddingBehavior(embed_chance = 0, embedded_pain_multiplier = 1)//elances should not be embeddable
+ embedding = list(embed_chance = 0, pain_mult = 1)//elances should not be embeddable
desc = "A makeshift spear with [G] attached to it."
update_icon()
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 80d1fa04c8..ba3eba9bd3 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -324,7 +324,7 @@
/obj/proc/rnd_crafted(obj/machinery/rnd/production/P)
return
-/obj/handle_ricochet(obj/projectile/P)
+/obj/handle_ricochet(obj/item/projectile/P)
. = ..()
if(. && ricochet_damage_mod)
take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet
diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
index 3981cf5c9c..a21c0656dc 100644
--- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
+++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
@@ -93,7 +93,7 @@
embedded()
add_mob_blood(target)//Place blood on the stake
loc = C // Put INSIDE the character
- B.receive_damage(w_class * embedding.pain_mult)
+ B.receive_damage(w_class * embedding["pain_mult"])
if(C.mind)
var/datum/antagonist/bloodsucker/bloodsucker = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
if(bloodsucker)
diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm
index 5b739430c2..fca85952c9 100644
--- a/code/modules/cargo/packs/security.dm
+++ b/code/modules/cargo/packs/security.dm
@@ -234,7 +234,6 @@
desc = "Contains one speedloader of .38 DumDum ammunition, good for embedding in soft targets. Requires Security or Forensics access to open."
cost = 1200
access = FALSE
- small_item = TRUE
access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS)
contains = list(/obj/item/ammo_box/c38/dumdum)
crate_name = ".38 match crate"
@@ -244,7 +243,6 @@
desc = "Contains one speedloader of match grade .38 ammunition, perfect for showing off trickshots. Requires Security or Forensics access to open."
cost = 1200
access = FALSE
- small_item = TRUE
access_any = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS)
contains = list(/obj/item/ammo_box/c38/match)
crate_name = ".38 match crate"
@@ -260,6 +258,5 @@
name = "Stingbang Single-Pack"
desc = "Contains one \"stingbang\" grenade, perfect for playing meanhearted pranks. Requires Security access to open."
cost = 1400
- small_item = TRUE
contains = list(/obj/item/grenade/stingbang)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3a9c5e1b12..62819f7de8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -247,7 +247,7 @@
/mob/living/carbon/Topic(href, href_list)
..()
//strip panel
- if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
+ if(usr.canUseTopic(src, BE_CLOSE))
if(href_list["internal"] && !HAS_TRAIT(src, TRAIT_NO_INTERNALS))
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
@@ -267,7 +267,7 @@
visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].", \
"[usr] [internal ? "opens" : "closes"] the valve on your [ITEM.name].", \
target = usr, target_message = "You [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].")
- if(href_list["embedded_object"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY))
+ if(href_list["embedded_object"] && usr.canUseTopic(src, BE_CLOSE))
var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts
if(!L)
return
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 560fc2972d..16c09a8166 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -72,7 +72,7 @@
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.forceMove(src)
I.embedded()
- L.receive_damage(I.w_class*I.embedding.impact_pain_mult)
+ L.receive_damage(I.w_class*I.embedding["impact_pain_mult"])
visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index f59cb4b68e..0a12718e5d 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -52,11 +52,6 @@
return martial_art_result
return ..()
-/mob/living/carbon/human/can_embed(obj/item/I)
- if(I.get_sharpness() || is_pointed(I) || is_type_in_typecache(I, GLOB.can_embed_types))
- return TRUE
- return FALSE
-
/mob/living/carbon/human/proc/check_martial_melee_block()
if(mind)
if(mind.martial_art && prob(mind.martial_art.block_chance) && mind.martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index b94c808550..d20553d8ad 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -120,7 +120,7 @@
hitpush = FALSE
skipcatch = TRUE
blocked = TRUE
- else if(I && I.throw_speed >= EMBED_THROWSPEED_THRESHOLD && can_embed(I, src) && prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && (!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) || incapacitated() || get_active_held_item()))
+ else if(I && I.throw_speed >= EMBED_THROWSPEED_THRESHOLD && can_embed(I, src) && prob(I.embedding["embed_chance"]) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && (!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) || incapacitated() || get_active_held_item()))
embed_item(I)
hitpush = FALSE
skipcatch = TRUE //can't catch the now embedded item
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 775b5aa1d4..08252d4e05 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -210,7 +210,7 @@
w_class = WEIGHT_CLASS_NORMAL
name = "energy dagger"
hitsound = 'sound/weapons/blade1.ogg'
- embedding = getEmbeddingBehavior(embed_chance = 100, embedded_fall_chance = 0) //rule of cool
+ embedding = list(embed_chance = 100, fall_chance = 0) //rule of cool
throwforce = 35
playsound(user, 'sound/weapons/saberon.ogg', 5, 1)
to_chat(user, "[src] is now active.")
diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm
index 170edf8ce3..0688d09e3c 100644
--- a/code/modules/projectiles/ammunition/ballistic/lmg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm
@@ -25,9 +25,9 @@
/obj/item/ammo_casing/mm712x82/match
name = "7.12x82mm match bullet casing"
desc = "A 7.12x82mm bullet casing manufactured to unfailingly high standards, you could pull off some cool trickshots with this."
- projectile_type = /obj/projectile/bullet/mm712x82_match
+ projectile_type = /obj/item/projectile/bullet/mm712x82_match
-/obj/projectile/bullet/mm712x82_match
+/obj/item/projectile/bullet/mm712x82_match
name = "7.12x82mm match bullet"
damage = 40
ricochets_max = 2
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index a80c94eb8a..693b258e3d 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -15,7 +15,7 @@
name = ".357 match bullet casing"
desc = "A .357 bullet casing, manufactured to exceedingly high standards."
caliber = "357"
- projectile_type = /obj/projectile/bullet/a357/match
+ projectile_type = /obj/item/projectile/bullet/a357/match
// 7.62x38mmR (Nagant Revolver)
@@ -58,14 +58,14 @@
/obj/item/ammo_casing/c38/match
name = ".38 Match bullet casing"
desc = "A .38 bullet casing, manufactured to exceedingly high standards."
- projectile_type = /obj/projectile/bullet/c38/match
+ projectile_type = /obj/item/projectile/bullet/c38/match
/obj/item/ammo_casing/c38/match/bouncy
name = ".38 Rubber bullet casing"
desc = "A .38 rubber bullet casing, manufactured to exceedingly high standards."
- projectile_type = /obj/projectile/bullet/c38/match/bouncy
+ projectile_type = /obj/item/projectile/bullet/c38/match/bouncy
/obj/item/ammo_casing/c38/dumdum
name = ".38 DumDum bullet casing"
desc = "A .38 DumDum bullet casing."
- projectile_type = /obj/projectile/bullet/c38/dumdum
\ No newline at end of file
+ projectile_type = /obj/item/projectile/bullet/c38/dumdum
\ No newline at end of file
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 817b805e78..4009027d25 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -45,6 +45,17 @@
desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload."
ammo_type = /obj/item/ammo_casing/c38/iceblox
+/obj/item/ammo_box/c38/dumdum
+ name = "speed loader (.38 DumDum)"
+ desc = "Designed to quickly reload revolvers. DumDum bullets shatter on impact and shred the target's innards, likely getting caught inside."
+ ammo_type = /obj/item/ammo_casing/c38/dumdum
+
+
+/obj/item/ammo_box/c38/match
+ name = "speed loader (.38 Match)"
+ desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with."
+ ammo_type = /obj/item/ammo_casing/c38/match
+
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
icon_state = "9mmbox"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index ea2673d9ce..d85e083cb5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -303,9 +303,9 @@
beam_segments[beam_index] = null
/obj/item/projectile/Bump(atom/A)
+ var/datum/point/pcache = trajectory.copy_to()
var/turf/T = get_turf(A)
if(trajectory && ricochets < ricochets_max && check_ricochet_flag(A) && check_ricochet(A))
- var/datum/point/pcache = trajectory.copy_to()
ricochets++
if(A.handle_ricochet(src))
on_ricochet(A)
@@ -391,7 +391,7 @@
return T
//Returns null if nothing at all was found.
-/obj/projectile/proc/check_ricochet(atom/A)
+/obj/item/projectile/proc/check_ricochet(atom/A)
var/chance = ricochet_chance * A.ricochet_chance_mod
if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT))
chance += NICE_SHOT_RICOCHET_BONUS
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index d38434832b..5643804ac1 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -20,7 +20,7 @@
ricochet_auto_aim_angle = 10
ricochet_auto_aim_range = 3
-/obj/projectile/bullet/c38/match
+/obj/item/projectile/bullet/c38/match
name = ".38 Match bullet"
ricochets_max = 4
ricochet_chance = 100
@@ -30,7 +30,7 @@
ricochet_decay_chance = 1
ricochet_decay_damage = 1
-/obj/projectile/bullet/c38/match/bouncy
+/obj/item/projectile/bullet/c38/match/bouncy
name = ".38 Rubber bullet"
damage = 10
stamina = 30
@@ -41,7 +41,7 @@
ricochet_decay_damage = 0.8
shrapnel_type = NONE
-/obj/projectile/bullet/c38/dumdum
+/obj/item/projectile/bullet/c38/dumdum
name = ".38 DumDum bullet"
damage = 15
armour_penetration = -30
@@ -106,7 +106,7 @@
armour_penetration = 45
// admin only really, for ocelot memes
-/obj/projectile/bullet/a357/match
+/obj/item/projectile/bullet/a357/match
name = ".357 match bullet"
ricochets_max = 5
ricochet_chance = 140
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
index 168dd7680c..47de66fcd1 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -16,7 +16,7 @@
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
- L.receive_damage(I.embedding.rip_pain_mult*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more
+ L.receive_damage(I.embedding["remove_pain_mult"]*I.w_class*painmul)//It hurts to rip it out, get surgery you dingus. And if you're ripping it out quickly via resist, it's gonna hurt even more
I.forceMove(get_turf(src))
I.unembedded()
user.put_in_hands(I)