diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 86b518234b..d9a6452f38 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -224,6 +224,11 @@
#define COMSIG_LIVING_RUN_BLOCK "living_do_run_block" //from base of mob/living/do_run_block(): (real_attack, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone)
#define COMSIG_LIVING_GET_BLOCKING_ITEMS "get_blocking_items" //from base of mob/living/get_blocking_items(): (list/items)
+#define COMSIG_LIVING_ACTIVE_BLOCK_START "active_block_start" //from base of mob/living/keybind_start_active_blocking(): (obj/item/blocking_item, list/backup_items)
+ #define COMPONENT_PREVENT_BLOCK_START 1
+#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items)
+ #define COMPONENT_PREVENT_PARRY_START 1
+
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore)
diff --git a/code/__DEFINES/skills/defines.dm b/code/__DEFINES/skills/defines.dm
index 60d2321927..47aaeeb1dc 100644
--- a/code/__DEFINES/skills/defines.dm
+++ b/code/__DEFINES/skills/defines.dm
@@ -8,12 +8,6 @@
/// Levels
#define SKILL_PROGRESSION_LEVEL 4
-
-/// Max value of skill for numerical skills
-#define SKILL_NUMERICAL_MAX 100
-/// Min value of skill for numerical skills
-#define SKILL_NUMERICAL_MIN 0
-
// Standard values for job starting skills
#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX
@@ -26,6 +20,13 @@
#define DEF_SKILL_GAIN 1
#define SKILL_GAIN_SURGERY_PER_STEP 0.25
+#define STD_USE_TOOL_MULT 1
+#define EASY_USE_TOOL_MULT 0.75
+#define TRIVIAL_USE_TOOL_MULT 0.5
+#define BARE_USE_TOOL_MULT 0.25
+
+//multiplier of the difference of max_value and min_value. Mostly for balance purposes between numerical and level-based skills.
+#define STD_NUM_SKILL_ITEM_GAIN_MULTI 0.002
//An extra point for each few seconds of delay when using a tool. Before the multiplier.
#define SKILL_GAIN_DELAY_DIVISOR 3 SECONDS
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 106db7f40a..bef06a69e9 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -123,7 +123,7 @@
if(totitemdamage)
totitemdamage = user.mind.item_action_skills_mod(I, totitemdamage, I.skill_difficulty, SKILL_ATTACK_OBJ, bad_trait)
for(var/skill in I.used_skills)
- if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_OBJ))
+ if(!(SKILL_TRAIN_ATTACK_OBJ in I.used_skills[skill]))
continue
user.mind.auto_gain_experience(skill, I.skill_gain)
@@ -192,9 +192,10 @@
if(.)
. = user.mind.item_action_skills_mod(I, ., I.skill_difficulty, SKILL_ATTACK_MOB, bad_trait)
for(var/skill in I.used_skills)
- if(!(I.used_skills[skill] & SKILL_TRAIN_ATTACK_MOB))
+ if(!(SKILL_TRAIN_ATTACK_MOB in I.used_skills[skill]))
continue
- user.mind.auto_gain_experience(skill, I.skill_gain)
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ user.mind.auto_gain_experience(skill, I.skill_gain*S.item_skill_gain_multi)
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
// Click parameters is the params string from byond Click() code, see that documentation.
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 6cf01ec8ff..f95ebf82b5 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -102,9 +102,8 @@
//stops TK grabs being equipped anywhere but into hands
/obj/item/tk_grab/equipped(mob/user, slot)
if(slot == SLOT_HANDS)
- return
+ return ..()
qdel(src)
- return
/obj/item/tk_grab/examine(user)
if (focus)
diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm
index 012c3ec9fe..e56ff3f0d1 100644
--- a/code/controllers/configuration/entries/comms.dm
+++ b/code/controllers/configuration/entries/comms.dm
@@ -25,4 +25,23 @@
/datum/config_entry/string/medal_hub_address
/datum/config_entry/string/medal_hub_password
- protection = CONFIG_ENTRY_HIDDEN
\ No newline at end of file
+ protection = CONFIG_ENTRY_HIDDEN
+
+/datum/config_entry/keyed_list/cross_server_bunker_override
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_TEXT
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateAndSet(str_val)
+ . = ..()
+ if(.)
+ var/list/newv = list()
+ for(var/I in config_entry_value)
+ newv[replacetext(I, "+", " ")] = config_entry_value[I]
+ config_entry_value = newv
+
+/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateListEntry(key_name, key_value)
+ return key_value != "byond:\\address:port" && ..()
+
+/datum/config_entry/flag/allow_cross_server_bunker_override
+ protection = CONFIG_ENTRY_LOCKED
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm
index 4626ef69d1..deab5e9b69 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/datums/components/crafting/guncrafting.dm
@@ -1,4 +1,4 @@
-k// PARTS //
+// PARTS //
/obj/item/weaponcrafting
icon = 'icons/obj/improvised.dmi'
@@ -8,61 +8,33 @@ k// PARTS //
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 6)
icon_state = "riflestock"
-/obj/item/weaponcrafting/durathread_string
- name = "durathread string"
- desc = "A long piece of durathread with some resemblance to cable coil."
+/obj/item/weaponcrafting/string
+ name = "wound thread"
+ desc = "A long piece of thread with some resemblance to cable coil."
icon_state = "durastring"
////////////////////////////////
-// KAT IMPROVISED WEAPON PARTS//
+// IMPROVISED WEAPON PARTS//
////////////////////////////////
/obj/item/weaponcrafting/improvised_parts
- name = "Eerie bunch of coloured dots."
- desc = "You feel the urge to report to Central that the parent type of guncrafting, which should never appear in this reality, has appeared. Whatever that means."
+ name = "Debug Improvised Gun Part"
+ desc = "A badly coded gun part. You should report coders if you see this."
icon = 'icons/obj/guns/gun_parts.dmi'
icon_state = "palette"
-// BARRELS
-
-/obj/item/weaponcrafting/improvised_parts/barrel_rifle
- name = "rifle barrel"
- desc = "A pipe with a diameter just the right size to fire 7.62 rounds out of."
- icon_state = "barrel_rifle"
-
-/obj/item/weaponcrafting/improvised_parts/barrel_shotgun
- name = "shotgun barrel"
- desc = "A twenty bore shotgun barrel."
- icon_state = "barrel_shotgun"
-
-/obj/item/weaponcrafting/improvised_parts/barrel_pistol
- name = "pistol barrel"
- desc = "A pipe with a small diameter and some holes finely cut into it. It fits .32 ACP bullets. Probably."
- icon_state = "barrel_pistol"
- w_class = WEIGHT_CLASS_SMALL
-
// RECEIVERS
/obj/item/weaponcrafting/improvised_parts/rifle_receiver
- name = "bolt action receiver"
- desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle. It's generic enough to modify to create other rifles, potentially."
+ name = "rifle receiver"
+ desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does
icon_state = "receiver_rifle"
w_class = WEIGHT_CLASS_SMALL
-/obj/item/weaponcrafting/improvised_parts/pistol_receiver
- name = "pistol receiver"
- desc = "A receiver to connect house and connects all the parts to make an improvised pistol."
- icon_state = "receiver_pistol"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weaponcrafting/improvised_parts/laser_receiver
- name = "energy emitter assembly"
- desc = "A mixture of components haphazardly wired together to form an energy emitter."
- icon_state = "laser_assembly"
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver
- name = "break-action assembly"
- desc = "An improvised receiver to create a break-action breechloaded shotgun. Parts of this are still useful if you want to make another type of shotgun, however."
+ name = "shotgun reciever"
+ desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does
icon_state = "receiver_shotgun"
w_class = WEIGHT_CLASS_SMALL
@@ -78,15 +50,3 @@ k// PARTS //
name = "wooden firearm body"
desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart."
icon_state = "wooden_body"
-
-/obj/item/weaponcrafting/improvised_parts/wooden_grip
- name = "wooden pistol grip"
- desc = "A nice wooden grip hollowed out for pistol magazines."
- icon_state = "wooden_pistolgrip"
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/weaponcrafting/improvised_parts/makeshift_lens
- name = "makeshift focusing lens"
- desc = "A properly made lens made with actual glassworking tools would perform much better, but this will have to do."
- icon_state = "focusing_lens"
- w_class = WEIGHT_CLASS_TINY
diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm
index e646d24018..aaae94df1d 100644
--- a/code/datums/components/crafting/recipes/recipes_primal.dm
+++ b/code/datums/components/crafting/recipes/recipes_primal.dm
@@ -103,7 +103,7 @@
/datum/crafting_recipe/bone_bow
name = "Bone Bow"
result = /obj/item/gun/ballistic/bow/ashen
- time = 200
+ time = 120 // 80+120 = 200
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 8,
/obj/item/stack/sheet/sinew = 4)
@@ -112,7 +112,7 @@
/datum/crafting_recipe/bow_tablet
name = "Sandstone Bow Making Manual"
result = /obj/item/book/granter/crafting_recipe/bone_bow
- time = 600 //Scribing
+ time = 200 //Scribing // don't care
always_availible = FALSE
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/mineral/sandstone = 4)
diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
index 177f6fb2b6..ec8ea86d24 100644
--- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -192,8 +192,8 @@
result = /obj/item/gun/ballistic/bow/pipe
reqs = list(/obj/item/pipe = 5,
/obj/item/stack/sheet/plastic = 15,
- /obj/item/weaponcrafting/durathread_string = 5)
- time = 450
+ /obj/item/weaponcrafting/string = 5)
+ time = 150
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -248,10 +248,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/ishotgun
+/datum/crafting_recipe/ishotgun // smaller and more versatile gun requires some better materials
name = "Improvised Shotgun"
result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 1,
+ reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks
/obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
@@ -262,10 +262,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/irifle
+/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make
name = "Improvised Rifle (7.62mm)"
result = /obj/item/gun/ballistic/shotgun/boltaction/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_rifle = 1,
+ reqs = list(/obj/item/pipe = 2, // above
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
/obj/item/weaponcrafting/improvised_parts/wooden_body = 1,
@@ -276,49 +276,6 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/ipistol
- name = "Improvised Pistol (.32)"
- result = /obj/item/gun/ballistic/automatic/pistol/improvised/nomag
- reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_pistol = 1,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
- /obj/item/weaponcrafting/improvised_parts/wooden_grip = 1,
- /obj/item/stack/sheet/plastic = 15,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WIRECUTTER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ilaser
- name = "Improvised Energy Gun"
- result = /obj/item/gun/energy/e_gun/old/improvised
- reqs = list(/obj/item/weaponcrafting/improvised_parts/laser_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 1,
- /obj/item/stock_parts/cell = 1,
- /obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 5,
- /obj/item/stack/cable_coil = 10)
- tools = list(TOOL_SCREWDRIVER)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
-/datum/crafting_recipe/ilaser/upgraded
- name = "Improvised Energy Gun Upgrade"
- result = /obj/item/gun/energy/e_gun/old/improvised/upgraded
- reqs = list(/obj/item/gun/energy/e_gun/old/improvised = 1,
- /obj/item/glasswork/glass_base/lens = 1,
- /obj/item/stock_parts/capacitor/quadratic = 2,
- /obj/item/stock_parts/micro_laser/ultra = 1,
- /obj/item/stock_parts/cell/bluespace = 1,
- /obj/item/stack/cable_coil = 5)
- tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL)
- time = 100
- category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
-
//////////////////
///AMMO CRAFTING//
//////////////////
@@ -326,9 +283,9 @@
/datum/crafting_recipe/arrow
name = "Arrow"
result = /obj/item/ammo_casing/caseless/arrow/wood
- time = 30
+ time = 5 // these only do 15 damage
reqs = list(/obj/item/stack/sheet/mineral/wood = 1,
- /obj/item/stack/sheet/durathread = 1,
+ /obj/item/stack/sheet/cloth = 1,
/obj/item/stack/rods = 1) // 1 metal sheet = 2 rods = 2 arrows
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -336,7 +293,7 @@
/datum/crafting_recipe/bone_arrow
name = "Bone Arrow"
result = /obj/item/ammo_casing/caseless/arrow/bone
- time = 30
+ time = 5
always_availible = FALSE
reqs = list(/obj/item/stack/sheet/bone = 1,
/obj/item/stack/sheet/sinew = 1,
@@ -348,7 +305,7 @@
name = "Ashen Arrow"
result = /obj/item/ammo_casing/caseless/arrow/ash
tools = list(TOOL_WELDER)
- time = 30
+ time = 10 // 1.5 seconds minimum per actually worthwhile arrow excluding interface lag
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow/wood = 1)
category = CAT_WEAPONRY
@@ -442,92 +399,28 @@
category = CAT_WEAPONRY
subcategory = CAT_AMMO
-/datum/crafting_recipe/m32acp
- name = ".32ACP Empty Magazine"
- result = /obj/item/ammo_box/magazine/m32acp/empty
- reqs = list(/obj/item/stack/sheet/metal = 3,
- /obj/item/stack/sheet/plasteel = 1,
- /obj/item/stack/packageWrap = 1)
- tools = list(TOOL_WELDER,TOOL_SCREWDRIVER)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
////////////////////
// PARTS CRAFTING //
////////////////////
-// BARRELS
-
-/datum/crafting_recipe/rifle_barrel
- name = "Improvised Rifle Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_rifle
- reqs = list(/obj/item/pipe = 2)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/shotgun_barrel
- name = "Improvised Shotgun Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_shotgun
- reqs = list(/obj/item/pipe = 2)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/pistol_barrel
- name = "Improvised Pistol Barrel"
- result = /obj/item/weaponcrafting/improvised_parts/barrel_pistol
- reqs = list(/obj/item/pipe = 1,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_WELDER,TOOL_SAW)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
// RECEIVERS
/datum/crafting_recipe/rifle_receiver
name = "Improvised Rifle Receiver"
result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 1)
+ reqs = list(/obj/item/stack/sheet/metal = 15) // you can carry multiple shotguns
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 50
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
/datum/crafting_recipe/shotgun_receiver
name = "Improvised Shotgun Receiver"
result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) // Dual wielding has been removed, plasteel is a soft timesink to obtain for most to make mass production harder.
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/pistol_receiver
- name = "Improvised Pistol Receiver"
- result = /obj/item/weaponcrafting/improvised_parts/pistol_receiver
- reqs = list(/obj/item/stack/sheet/metal = 5,
- /obj/item/stack/sheet/plasteel = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_SAW)
- time = 50
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/laser_receiver
- name = "Energy Weapon Assembly"
- result = /obj/item/weaponcrafting/improvised_parts/laser_receiver
- reqs = list(/obj/item/stack/sheet/metal = 10,
- /obj/item/stock_parts/capacitor = 2,
- /obj/item/stock_parts/micro_laser = 1,
- /obj/item/assembly/prox_sensor = 1)
- tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WELDER) // Prox sensor and multitool for the circuit board, welder for extremely ghetto soldering.
- time = 150
+ reqs = list(/obj/item/stack/sheet/metal = 15,
+ /obj/item/stack/sheet/plasteel = 1) // requires access or hacking since shotgun is better
+ tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
@@ -539,16 +432,6 @@
reqs = list(/obj/item/stack/sheet/metal = 3,
/obj/item/assembly/igniter = 1)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
- time = 150
- category = CAT_WEAPONRY
- subcategory = CAT_PARTS
-
-/datum/crafting_recipe/makeshift_lens
- name = "Makeshift Lens"
- result = /obj/item/weaponcrafting/improvised_parts/makeshift_lens
- reqs = list(/obj/item/stack/sheet/metal = 1,
- /obj/item/stack/sheet/glass = 2)
- tools = list(TOOL_WELDER) // Glassmaking lets you make non-makeshift lenses.
- time = 50
+ time = 25
category = CAT_WEAPONRY
subcategory = CAT_PARTS
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index e3c7726d61..4682595aec 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -58,12 +58,10 @@
var/datum/martial_art/boxing/style = new
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_GLOVES)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,TRUE)
- return
/obj/item/clothing/gloves/boxing/dropped(mob/user)
. = ..()
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 50438d9d8d..c2fe24a20d 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -196,9 +196,8 @@
var/datum/martial_art/krav_maga/style = new
/obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_GLOVES)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,1)
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 87fcf78964..18fd8e7b18 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -377,7 +377,7 @@
var/turf/ST = null
var/falling = 0
var/damage = damage_roll(A,D)
-
+
for (var/obj/O in oview(1, A))
if (O.density == 1)
if (O == A)
@@ -472,12 +472,10 @@
var/datum/martial_art/wrestling/style = new
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
- if(!ishuman(user))
- return
- if(slot == SLOT_BELT)
+ . = ..()
+ if(ishuman(user) && slot == SLOT_BELT)
var/mob/living/carbon/human/H = user
style.teach(H,1)
- return
/obj/item/storage/belt/champion/wrestling/dropped(mob/user)
. = ..()
diff --git a/code/datums/skills/_check_skills.dm b/code/datums/skills/_check_skills.dm
index 2421bd36ff..d02a716b8a 100644
--- a/code/datums/skills/_check_skills.dm
+++ b/code/datums/skills/_check_skills.dm
@@ -40,7 +40,7 @@
. = list()
.["playername"] = owner.name
.["see_skill_mods"] = see_skill_mods
- .["admin"] = check_rights(R_DEBUG)
+ .["admin"] = check_rights(R_DEBUG, FALSE)
/datum/skill_holder/ui_act(action, params)
. = ..()
diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm
index e3f1d00ae6..eecf416b1b 100644
--- a/code/datums/skills/_skill.dm
+++ b/code/datums/skills/_skill.dm
@@ -33,6 +33,10 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
var/base_multiplier = 1
/// Value added to the base multiplier depending on overall competency compared to maximum value/level.
var/competency_multiplier = 1
+ /// Experience gain multiplier gained from using items.
+ var/item_skill_gain_multi = 1
+ /// Skill gain quantisation
+ var/skill_gain_quantisation = 0.1
/// A list of ways this skill can affect or be affected through actions and skill modifiers.
var/list/skill_traits = list(SKILL_SANITY, SKILL_INTELLIGENCE)
/// Index of this skill in the UI
@@ -108,6 +112,10 @@ GLOBAL_LIST_INIT_TYPED(skill_datums, /datum/skill, init_skill_datums())
/// Min value of this skill
var/min_value = 0
+/datum/skill/numerical/New()
+ ..()
+ skill_gain_quantisation = item_skill_gain_multi = item_skill_gain_multi * (max_value - min_value) * STD_NUM_SKILL_ITEM_GAIN_MULTI
+
/datum/skill/numerical/sanitize_value(new_value)
return clamp(new_value, min_value, max_value)
diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm
index 8357211463..73748417c3 100644
--- a/code/datums/skills/_skill_holder.dm
+++ b/code/datums/skills/_skill_holder.dm
@@ -91,10 +91,10 @@
CRASH("Invalid set_skill_value call. Use skill typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
var/datum/skill/S = GLOB.skill_datums[skill]
value = S.sanitize_value(value)
- skill_holder.need_static_data_update = TRUE
if(!isnull(value))
LAZYINITLIST(skill_holder.skills)
S.set_skill_value(skill_holder, value, src, silent)
+ skill_holder.need_static_data_update = TRUE
return TRUE
return FALSE
@@ -120,11 +120,9 @@
CRASH("You cannot auto increment a non numerical(experience skill!")
var/current = get_skill_value(skill, FALSE)
var/affinity = get_skill_affinity(skill)
- var/target_value = current + (value * affinity)
- if(maximum)
- target_value = min(target_value, maximum)
- if(target_value == maximum) //no more experience to gain, early return.
- return
+ var/target_value = round(current + (value * affinity), S.skill_gain_quantisation)
+ if(maximum && target_value >= maximum) //no more experience to gain, early return.
+ return
boost_skill_value_to(skill, target_value, silent, current)
/**
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 30699d36f4..261e423640 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -74,6 +74,25 @@
for(var/client/C in GLOB.clients)
C.AnnouncePR(final_composed)
+/datum/world_topic/auto_bunker_passthrough
+ keyword = "auto_bunker_override"
+ require_comms_key = TRUE
+
+/datum/world_topic/auto_bunker_passthrough/Run(list/input)
+ if(!CONFIG_GET(flag/allow_cross_server_bunker_override))
+ return "Function Disabled"
+ var/ckeytobypass = input["ckey"]
+ var/is_new_ckey = !(ckey(ckeytobypass) in GLOB.bunker_passthrough)
+ var/sender = input["source"] || "UNKNOWN"
+ GLOB.bunker_passthrough |= ckey(ckeytobypass)
+ GLOB.bunker_passthrough[ckey(ckeytobypass)] = world.realtime
+ SSpersistence.SavePanicBunker() //we can do this every time, it's okay
+ if(!is_new_ckey)
+ log_admin("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ message_admins("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ send2irc("Panic Bunker", "AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).")
+ return "Success"
+
/datum/world_topic/ahelp_relay
keyword = "Ahelp"
require_comms_key = TRUE
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 2c7f701a6e..44164ed86c 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -666,28 +666,18 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 50,
- /obj/item/weaponcrafting/improvised_parts/barrel_rifle = 10,
- /obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 5,
- /obj/item/weaponcrafting/improvised_parts/barrel_pistol = 5,
- /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 10,
- /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 3,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 3,
- /obj/item/weaponcrafting/improvised_parts/laser_receiver = 1,
- /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 10,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 3,
+ /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 13,
+ /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 13,
+ /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 12,
)
/obj/effect/spawner/lootdrop/weapon_parts
- name = "random weapon parts spawner 25%"
+ name = "random weapon parts spawner 20%"
lootcount = 1
spawn_on_turf = FALSE
- loot = list("" = 75,
- /obj/item/weaponcrafting/improvised_parts/barrel_rifle = 5,
- /obj/item/weaponcrafting/improvised_parts/barrel_pistol = 5,
+ loot = list("" = 80,
/obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5,
- /obj/item/weaponcrafting/improvised_parts/pistol_receiver = 2,
/obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5,
- /obj/item/weaponcrafting/improvised_parts/makeshift_lens = 3,
)
/obj/effect/spawner/lootdrop/ammo
@@ -695,8 +685,6 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 25,
- /obj/item/ammo_box/c32mm = 15,
- /obj/item/ammo_box/r32mm = 15,
/obj/item/ammo_box/magazine/wt550m9 = 1,
/obj/item/ammo_casing/shotgun/buckshot = 7,
/obj/item/ammo_casing/shotgun/rubbershot = 7,
@@ -709,8 +697,6 @@
lootcount = 1
spawn_on_turf = FALSE
loot = list("" = 50,
- /obj/item/ammo_box/c32mm = 7,
- /obj/item/ammo_box/r32mm = 7,
/obj/item/ammo_box/magazine/wt550m9 = 2,
/obj/item/ammo_casing/shotgun/buckshot = 10,
/obj/item/ammo_casing/shotgun/rubbershot = 10,
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9f1b830cf0..90e232938c 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -68,6 +68,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/click_delay = CLICK_CD_MELEE
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
+ var/current_equipped_slot
pass_flags = PASSTABLE
pressure_resistance = 4
var/obj/item/master = null
@@ -179,6 +180,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(damtype == "brute")
hitsound = "swing_hit"
+ if(used_skills)
+ for(var/path in used_skills)
+ var/datum/skill/S = GLOB.skill_datums[path]
+ LAZYADD(used_skills[path], S.skill_traits)
+
/obj/item/Destroy()
item_flags &= ~DROPDEL //prevent reqdels
if(ismob(loc))
@@ -315,6 +321,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
return
if(anchored)
return
+ if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS)
+ if(current_equipped_slot in user.check_obscured_slots())
+ to_chat(src, "You are unable to unequip that while wearing other garments over it!")
+ return FALSE
if(resistance_flags & ON_FIRE)
var/mob/living/carbon/C = user
@@ -336,7 +346,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
C.update_damage_overlays()
return
- if(acid_level > 20 && !ismob(loc))// so we can still remove the clothes on us that have acid.
+ if(acid_level > 20 && ismob(loc))// so we can still remove the clothes on us that have acid.
var/mob/living/carbon/C = user
if(istype(C))
if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF))))
@@ -379,6 +389,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
return
if(anchored)
return
+ if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS)
+ if(current_equipped_slot in user.check_obscured_slots())
+ to_chat(src, "You are unable to unequip that while wearing other garments over it!")
+ return FALSE
+
SEND_SIGNAL(loc, COMSIG_TRY_STORAGE_TAKE, src, user.loc, TRUE)
@@ -423,6 +438,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/dropped(mob/user)
SHOULD_CALL_PARENT(TRUE)
+ current_equipped_slot = null
for(var/X in actions)
var/datum/action/A = X
A.Remove(user)
@@ -470,7 +486,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(mob/user, slot)
+ SHOULD_CALL_PARENT(TRUE)
. = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
+ current_equipped_slot = slot
if(!(. & COMPONENT_NO_GRANT_ACTIONS))
for(var/X in actions)
var/datum/action/A = X
@@ -835,7 +853,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
// Called when a mob tries to use the item as a tool.
// Handles most checks.
-/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks, skill_gain_mult = 1, max_level = INFINITY)
+/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks, skill_gain_mult = STD_USE_TOOL_MULT)
// No delay means there is no start message, and no reason to call tool_start_check before use_tool.
// Run the start check here so we wouldn't have to call it manually.
if(!delay && !tool_start_check(user, amount))
@@ -880,7 +898,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
for(var/skill in used_skills)
if(!(SKILL_TRAINING_TOOL in used_skills[skill]))
continue
- user.mind.auto_gain_experience(skill, gain*skill_gain_mult, GET_STANDARD_LVL(max_level))
+ var/datum/skill/S = GLOB.skill_datums[skill]
+ user.mind.auto_gain_experience(skill, gain*skill_gain_mult*S.item_skill_gain_multi)
return TRUE
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index bfbacb1a34..de32375642 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -794,6 +794,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
reagents.clear_reagents()
/obj/item/clothing/mask/vape/equipped(mob/user, slot)
+ . = ..()
if(slot == SLOT_WEAR_MASK)
if(!screw)
to_chat(user, "You start puffing on the vape.")
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 4ce0e811c3..f06dd634c6 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -97,7 +97,7 @@
to_chat(user, "You add [A] to the [initial(name)] assembly.")
else if(stage == EMPTY && istype(I, /obj/item/stack/cable_coil))
- if (I.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
+ if (I.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
det_time = 50 // In case the cable_coil was removed and readded.
stage_change(WIRED)
to_chat(user, "You rig the [initial(name)] assembly.")
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 4b8728e426..1f69cdae2e 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -355,6 +355,7 @@
emaggedhitdamage = 0
/obj/item/borg/lollipop/equipped()
+ . = ..()
check_amount()
/obj/item/borg/lollipop/dropped(mob/user)
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index aefa5d3cc8..154714b13f 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -26,7 +26,7 @@
/datum/block_parry_data/shield
block_damage_multiplier = 0.25
block_stamina_efficiency = 2.5
- block_stamina_cost_per_second = 3.5
+ block_stamina_cost_per_second = 2.5
block_slowdown = 0
block_lock_attacking = FALSE
block_lock_sprinting = TRUE
@@ -386,7 +386,7 @@ obj/item/shield/riot/bullet_proof
max_integrity = 100
obj_integrity = 100
can_shatter = FALSE
- item_flags = SLOWS_WHILE_IN_HAND
+ item_flags = SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK
var/recharge_timerid
var/recharge_delay = 15 SECONDS
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 57af862b69..d4baea2487 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
if (get_amount() < 1 || CC.get_amount() < 5)
to_chat(user, "You attach wire to the [name].")
var/obj/item/stack/light_w/new_tile = new(user.loc)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 280de95388..4502784ca2 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -242,9 +242,8 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\
)),
null, \
- new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 40), \
- new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
- new/datum/stack_recipe("pistol grip", /obj/item/weaponcrafting/improvised_parts/wooden_grip, 5, time = 40), \
+ new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \
+ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
@@ -384,6 +383,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \
new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
null, \
+ new/datum/stack_recipe("string", /obj/item/weaponcrafting/string, 1, time = 10), \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
@@ -431,7 +431,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
- new/datum/stack_recipe("durathread string", /obj/item/weaponcrafting/durathread_string, 1, time = 40), \
))
/obj/item/stack/sheet/durathread
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 821fd52bd1..927a29407c 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -207,18 +207,18 @@
cig_position++
/obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!ismob(M))
- return
+ if(M != user || !istype(M))
+ return ..()
var/obj/item/clothing/mask/cigarette/cig = locate(/obj/item/clothing/mask/cigarette) in contents
if(cig)
- if(M == user && contents.len > 0 && !user.wear_mask)
+ if(!user.wear_mask && !(SLOT_WEAR_MASK in M.check_obscured_slots()))
var/obj/item/clothing/mask/cigarette/W = cig
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M)
M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK)
contents -= W
to_chat(user, "You take \a [W] out of the pack.")
else
- ..()
+ return ..()
else
to_chat(user, "There are no [icon_type]s left in the pack.")
diff --git a/code/game/objects/items/tools/saw.dm b/code/game/objects/items/tools/saw.dm
deleted file mode 100644
index aab59c00be..0000000000
--- a/code/game/objects/items/tools/saw.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-/obj/item/hatchet/saw
- name = "handsaw"
- desc = "A very sharp handsaw, it's compact."
- icon = 'icons/obj/tools.dmi'
- icon_state = "saw"
- item_state = "sawhandle_greyscale"
- lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
- tool_behaviour = TOOL_SAW
- force = 10
- throwforce = 8
- throw_speed = 3
- throw_range = 5
- custom_materials = list(/datum/material/iron = 5000)
- attack_verb = list("sawed", "sliced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- var/random_color = TRUE //code taken from screwdrivers.dm; cool handles are cool.
- var/static/list/saw_colors = list(
- "blue" = rgb(24, 97, 213),
- "red" = rgb(255, 0, 0),
- "pink" = rgb(213, 24, 141),
- "brown" = rgb(160, 82, 18),
- "green" = rgb(14, 127, 27),
- "cyan" = rgb(24, 162, 213),
- "yellow" = rgb(255, 165, 0)
- )
-
-/obj/item/hatchet/saw/Initialize()
- . = ..()
- if(random_color)
- icon_state = "sawhandle_greyscale"
- var/our_color = pick(saw_colors)
- add_atom_colour(saw_colors[our_color], FIXED_COLOUR_PRIORITY)
- update_icon()
- if(prob(75))
- pixel_y = rand(-8, 8)
-
-/obj/item/hatchet/saw/update_overlays()
- . = ..()
- if(!random_color) //icon override
- return
- var/mutable_appearance/base_overlay = mutable_appearance(icon, "sawblade")
- base_overlay.appearance_flags = RESET_COLOR
- . += base_overlay
-
-// END
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index aa2c6d1c88..bf1eca01f9 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -450,8 +450,7 @@
sharpness = IS_BLUNT
/obj/item/dualsaber/toy/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/two_handed, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
+ AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
/obj/item/dualsaber/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
return BLOCK_NONE
@@ -469,9 +468,8 @@
slowdown_wielded = 0
sharpness = IS_BLUNT
-/obj/item/dualsaber/toy/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/two_handed, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
+/obj/item/dualsaber/hypereutactic/toy/ComponentInitialize()
+ AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=0, wieldsound='sound/weapons/saberon.ogg', unwieldsound='sound/weapons/saberoff.ogg')
/obj/item/dualsaber/hypereutactic/toy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
return BLOCK_NONE
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index 3ddb4e67ee..4e08ad2382 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -108,8 +108,7 @@
//Life, Stat, Hud Updates, and Say
/mob/living/simple_animal/revenant/BiologicalLife(seconds, times_fired)
- if(!(. = ..()))
- return
+ . = ..()
if(stasis)
return
if(revealed && essence <= 0)
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index f714a86f22..129e6d7a2b 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -189,6 +189,8 @@
if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
to_chat(user, "You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.")
user.dropItemToGround(src)
+ return
+ return ..()
/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll)
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 12536b4382..7f670e756f 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -19,6 +19,8 @@
///Next tick to reset the total message counter
var/total_count_reset = 0
var/ircreplyamount = 0
+ /// last time they tried to do an autobunker auth
+ var/autobunker_last_try = 0
/////////
//OTHER//
diff --git a/code/modules/client/verbs/autobunker.dm b/code/modules/client/verbs/autobunker.dm
new file mode 100644
index 0000000000..03200c5f0b
--- /dev/null
+++ b/code/modules/client/verbs/autobunker.dm
@@ -0,0 +1,37 @@
+/client/verb/bunker_auto_authorize()
+ set name = "Auto Authorize Panic Bunker"
+ set desc = "Authorizes your account in the panic bunker of any servers connected to this function."
+ set category = "OOC"
+
+ if(autobunker_last_try + 5 SECONDS > world.time)
+ to_chat(src, "Function on cooldown, try again in 5 seconds.")
+ return
+ autobunker_last_try = world.time
+
+ world.send_cross_server_bunker_overrides(key, src)
+
+/world/proc/send_cross_server_bunker_overrides(key, client/C)
+ var/comms_key = CONFIG_GET(string/comms_key)
+ if(!comms_key)
+ return
+ var/list/message = list()
+ message["ckey"] = key
+ message["source"] = "[CONFIG_GET(string/cross_comms_name)]"
+ message["key"] = comms_key
+ message["auto_bunker_override"] = TRUE
+ var/list/servers = CONFIG_GET(keyed_list/cross_server_bunker_override)
+ if(!length(servers))
+ to_chat(C, "AUTOBUNKER: No servers are configured to receive from this one.")
+ return
+ log_admin("[key] ([key_name(C)]) has initiated an autobunker authentication with linked servers.")
+ for(var/name in servers)
+ var/returned = world.Export("[servers[name]]?[list2params(message)]")
+ switch(returned)
+ if("Bad Key")
+ to_chat(C, "AUTOBuNKER: [name] failed to authenticate with this server.")
+ if("Function Disabled")
+ to_chat(C, "AUTOBUNKER: [name] has autobunker receive disabled.")
+ if("Success")
+ to_chat(C, "AUTOBUNKER: Successfully authenticated with [name]. Panic bunker bypass granted to [key]..")
+ else
+ to_chat(C, "AUTOBUNKER: Unknown error ([name]).")
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 1b5cd6c7d2..56d6e7d38f 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -23,14 +23,15 @@
if(iscarbon(target) && proximity)
var/mob/living/carbon/C = target
var/mob/living/carbon/U = user
- var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE)
+ var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE, clothing_check = TRUE)
if(success)
if(C == user)
C.visible_message("[U] sprays their hands with glittery rubber!")
else
C.visible_message("[U] sprays glittery rubber on the hands of [C]!")
else
- C.visible_message("The rubber fails to stick to [C]'s hands!")
+ user.visible_message("The rubber fails to stick to [C]'s hands!",
+ "The rubber fails to stick to [C]'s [(SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!")
qdel(src)
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 639f2d3bfb..60f8cc179a 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -164,7 +164,7 @@
RemoveHelmet()
..()
-/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
+/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet(message = TRUE)
if(!helmet)
return
suittoggled = FALSE
@@ -174,16 +174,18 @@
helmet.attack_self(H)
H.transferItemToLoc(helmet, src, TRUE)
H.update_inv_wear_suit()
- to_chat(H, "The helmet on the hardsuit disengages.")
+ if(message)
+ to_chat(H, "The helmet on the hardsuit disengages.")
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
else
helmet.forceMove(src)
+ return TRUE
/obj/item/clothing/suit/space/hardsuit/dropped(mob/user)
..()
RemoveHelmet()
-/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
+/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet(message = TRUE)
var/mob/living/carbon/human/H = loc
if(!helmettype)
return
@@ -192,15 +194,19 @@
if(!suittoggled)
if(ishuman(src.loc))
if(H.wear_suit != src)
- to_chat(H, "You must be wearing [src] to engage the helmet!")
+ if(message)
+ to_chat(H, "You must be wearing [src] to engage the helmet!")
return
if(H.head)
- to_chat(H, "You're already wearing something on your head!")
+ if(message)
+ to_chat(H, "You're already wearing something on your head!")
return
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
- to_chat(H, "You engage the helmet on the hardsuit.")
+ if(message)
+ to_chat(H, "You engage the helmet on the hardsuit.")
suittoggled = TRUE
H.update_inv_wear_suit()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
+ return TRUE
else
- RemoveHelmet()
+ return RemoveHelmet(message)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index b18f4396d6..a666a36099 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -392,7 +392,7 @@
/datum/plant_gene/trait/battery/on_attackby(obj/item/reagent_containers/food/snacks/grown/G, obj/item/I, mob/user)
if(istype(I, /obj/item/stack/cable_coil))
- if(I.use_tool(src, user, 0, 5, max_level = JOB_SKILL_EXPERT))
+ if(I.use_tool(src, user, 0, 5, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "You add some cable to [G] and slide it inside the battery encasing.")
var/obj/item/stock_parts/cell/potato/pocell = new /obj/item/stock_parts/cell/potato(user.loc)
pocell.icon_state = G.icon_state
diff --git a/code/modules/keybindings/keybind/combat.dm b/code/modules/keybindings/keybind/combat.dm
index 457fbb0cb2..8a0e713d8f 100644
--- a/code/modules/keybindings/keybind/combat.dm
+++ b/code/modules/keybindings/keybind/combat.dm
@@ -25,6 +25,17 @@
var/mob/living/L = user.mob
L.keybind_stop_active_blocking()
+/datum/keybinding/living/active_block_toggle
+ name = "active_block_toggle"
+ full_name = "Block (Toggle)"
+ category = CATEGORY_COMBAT
+ description = "Toggles active blocking system using currenet in hand object, or any found object if applicable."
+
+/datum/keybinding/living/active_block_toggle/down(client/user)
+ var/mob/living/L = user.mob
+ L.keybind_toggle_active_blocking()
+ return TRUE
+
/datum/keybinding/living/active_parry
hotkey_keys = list("Insert", "G")
name = "active_parry"
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index b3462773d8..8bc9cc4512 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -390,7 +390,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
to_chat(user, "There already is a string attached to this coin!")
return
- if (W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_BASIC))
+ if (W.use_tool(src, user, 0, 1, skill_gain_mult = BARE_USE_TOOL_MULT))
add_overlay("coin_string_overlay")
string_attached = 1
to_chat(user, "You attach a string to the coin.")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm b/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
deleted file mode 100644
index e2537f0f4f..0000000000
--- a/code/modules/mob/living/carbon/alien/humanoid/inventory.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/carbon/alien/humanoid/doUnEquip(obj/item/I)
- . = ..()
- if(!. || !I)
- return
-
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index eb1b38b9ff..e35c905539 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -88,6 +88,7 @@
Die()
/obj/item/clothing/mask/facehugger/equipped(mob/M)
+ . = ..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
@@ -254,7 +255,7 @@
return FALSE
if(AmBloodsucker(M))
return FALSE
-
+
if(ismonkey(M))
return 1
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8451dc4060..a2d53f6f0a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -227,25 +227,27 @@
SEND_SIGNAL(src, COMSIG_CARBON_EMBED_RIP, I, L)
return
if(href_list["toggle_helmet"])
- var/hardsuit_head = head && istype(head, /obj/item/clothing/head/helmet/space/hardsuit)
+ if(!istype(head, /obj/item/clothing/head/helmet/space/hardsuit))
+ return
+ var/obj/item/clothing/head/helmet/space/hardsuit/hardsuit_head = head
visible_message("[usr] tries to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.", \
"[usr] tries to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.", \
target = usr, target_message = "You try to [hardsuit_head ? "retract" : "extend"] [src]'s helmet.")
- if(!do_mob(usr, src, POCKET_STRIP_DELAY))
+ if(!do_mob(usr, src, hardsuit_head ? head.strip_delay : POCKET_STRIP_DELAY))
return
- visible_message("[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
- "[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
- target = usr, target_message = "You [hardsuit_head ? "retract" : "extend"] [src]'s helmet.")
- if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
+ if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit) || (hardsuit_head ? (!head || head != hardsuit_head) : head))
return
var/obj/item/clothing/suit/space/hardsuit/hardsuit = wear_suit //This should be an hardsuit given all our checks
- hardsuit.ToggleHelmet()
+ if(hardsuit.ToggleHelmet(FALSE))
+ visible_message("[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
+ "[usr] [hardsuit_head ? "retract" : "extend"] [src]'s helmet", \
+ target = usr, target_message = "You [hardsuit_head ? "retract" : "extend"] [src]'s helmet.")
return
if(href_list["item"])
var/slot = text2num(href_list["item"])
if(slot in check_obscured_slots())
to_chat(usr, "You can't reach that! Something is covering it.")
- return
+ return
if(href_list["pockets"])
var/strip_mod = 1
var/strip_silence = FALSE
diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm
index e1b90716b6..4211b2cfd9 100644
--- a/code/modules/mob/living/living_active_block.dm
+++ b/code/modules/mob/living/living_active_block.dm
@@ -14,14 +14,14 @@
changeNext_move(data.block_end_click_cd_add)
return TRUE
-/mob/living/proc/start_active_blocking(obj/item/I)
+/mob/living/proc/ACTIVE_BLOCK_START(obj/item/I)
if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING))
return FALSE
if(!(I in held_items))
return FALSE
var/datum/block_parry_data/data = I.get_block_parry_data()
if(!istype(data)) //Typecheck because if an admin/coder screws up varediting or something we do not want someone being broken forever, the CRASH logs feedback so we know what happened.
- CRASH("start_active_blocking called with an item with no valid data: [I] --> [I.block_parry_data]!")
+ CRASH("ACTIVE_BLOCK_START called with an item with no valid data: [I] --> [I.block_parry_data]!")
combat_flags |= COMBAT_FLAG_ACTIVE_BLOCKING
active_block_item = I
if(data.block_lock_attacking)
@@ -83,9 +83,15 @@
return FALSE
// QOL: Instead of trying to just block with held item, grab first available item.
var/obj/item/I = find_active_block_item()
- if(!I)
- to_chat(src, "You can't block with your bare hands!")
+ var/list/other_items = list()
+ if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_BLOCK_START, I, other_items) & COMPONENT_PREVENT_BLOCK_START)
+ to_chat(src, "Something is preventing you from blocking!")
return
+ if(!I)
+ if(!length(other_items))
+ to_chat(src, "You can't block with your bare hands!")
+ return
+ I = other_items[1]
if(!I.can_active_block())
to_chat(src, "[I] is either not capable of being used to actively block, or is not currently in a state that can! (Try wielding it if it's twohanded, for example.)")
return
@@ -104,7 +110,7 @@
animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN, ANIMATION_END_NOW)
return
combat_flags &= ~(COMBAT_FLAG_ACTIVE_BLOCK_STARTING)
- start_active_blocking(I)
+ ACTIVE_BLOCK_START(I)
/**
* Gets the first item we can that can block, but if that fails, default to active held item.COMSIG_ENABLE_COMBAT_MODE
@@ -115,7 +121,8 @@
for(var/obj/item/I in held_items - held)
if(I.can_active_block())
return I
- return held
+ else
+ return held
/**
* Proc called by keybindings to stop active blocking.
diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm
index 50b51d4d95..0dab70b045 100644
--- a/code/modules/mob/living/living_active_parry.dm
+++ b/code/modules/mob/living/living_active_parry.dm
@@ -24,25 +24,39 @@
// yanderedev else if time
var/obj/item/using_item = get_active_held_item()
var/datum/block_parry_data/data
+ var/datum/tool
var/method
if(using_item?.can_active_parry())
data = using_item.block_parry_data
method = ITEM_PARRY
+ tool = using_item
else if(mind?.martial_art?.can_martial_parry)
data = mind.martial_art.block_parry_data
method = MARTIAL_PARRY
+ tool = mind.martial_art
else if(combat_flags & COMBAT_FLAG_UNARMED_PARRY)
data = block_parry_data
method = UNARMED_PARRY
+ tool = src
else
// QOL: If none of the above work, try to find another item.
var/obj/item/backup = find_backup_parry_item()
- if(!backup)
- to_chat(src, "You have nothing to parry with!")
- return FALSE
- data = backup.block_parry_data
- using_item = backup
+ if(backup)
+ tool = backup
+ data = backup.block_parry_data
+ using_item = backup
+ method = ITEM_PARRY
+ var/list/other_items = list()
+ if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items) & COMPONENT_PREVENT_PARRY_START)
+ to_chat(src, "Something is preventing you from parrying!")
+ return
+ if(!using_item && !method && length(other_items))
+ using_item = other_items[1]
method = ITEM_PARRY
+ data = using_item.block_parry_data
+ if(!method)
+ to_chat(src, "You have nothing to parry with!")
+ return FALSE
//QOL: Try to enable combat mode if it isn't already
SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE)
if(!SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE))
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 633135b3d2..51cff93ceb 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -315,7 +315,7 @@
if (getFireLoss() > 0 || getToxLoss() > 0)
if(src == user)
to_chat(user, "You start fixing yourself...")
- if(!W.use_tool(src, user, 50, 1, max_level = JOB_SKILL_TRAINED))
+ if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "You need more cable to repair [src]!")
return
adjustFireLoss(-10)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 0124249baf..fd9afc91cd 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -227,7 +227,7 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
var/obj/item/W = get_active_held_item()
if(istype(W))
- if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, TRUE))
+ if(equip_to_slot_if_possible(W, slot, FALSE, FALSE, FALSE, FALSE, TRUE))
return TRUE
if(!W)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index c18eebbb55..f911a6a4e4 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -118,7 +118,7 @@
return
if(istype(W, /obj/item/stack/cable_coil))
- if(W.use_tool(src, user, 0, 1, max_level = JOB_SKILL_TRAINED))
+ if(W.use_tool(src, user, 0, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
icon_state = "[fixture_type]-construct-stage2"
stage = 2
user.visible_message("[user.name] adds wires to [src].", \
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index 2077b108d7..07f3b4c997 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -51,17 +51,3 @@
desc = "A .50AE bullet casing."
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/a50AE
-
-// .32 ACP (Improvised Pistol)
-
-/obj/item/ammo_casing/c32acp
- name = ".32 bullet casing"
- desc = "A .32 bullet casing."
- caliber = "c32acp"
- projectile_type = /obj/item/projectile/bullet/c32acp
-
-/obj/item/ammo_casing/r32acp
- name = ".32 rubber bullet casing"
- desc = "A .32 rubber bullet casing."
- caliber = "c32acp"
- projectile_type = /obj/item/projectile/bullet/r32acp
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 492b91ec2d..174645dd11 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -12,15 +12,6 @@
e_cost = 200
select_name = "kill"
-/obj/item/ammo_casing/energy/lasergun/improvised
- projectile_type = /obj/item/projectile/beam/weak/improvised
- e_cost = 200
- select_name = "kill"
-
-/obj/item/ammo_casing/energy/lasergun/improvised/upgraded
- projectile_type = /obj/item/projectile/beam/weak
- e_cost = 100
-
/obj/item/ammo_casing/energy/laser/hos
e_cost = 100
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 86d66ec354..e4674f4f4c 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -55,18 +55,6 @@
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/c32mm
- name = "ammo box (.32 acp)"
- desc = "Lethal .32 acp bullets, there's forty in the box."
- ammo_type = /obj/item/ammo_casing/c32acp
- max_ammo = 40
-
-/obj/item/ammo_box/r32mm
- name = "ammo box (rubber .32 acp)"
- desc = "Non-lethal .32 acp bullets, there's forty in the box."
- ammo_type = /obj/item/ammo_casing/r32acp
- max_ammo = 40
-
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
icon_state = "9mmbox"
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index 1852b839f4..63b0483875 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -66,15 +66,3 @@
caliber = ".50"
max_ammo = 7
multiple_sprites = 1
-
-/obj/item/ammo_box/magazine/m32acp
- name = "pistol magazine (.32)"
- desc = "A crudely construction pistol magazine that holds .32 ACP rounds. It looks like it can only fit eight bullets."
- icon_state = "32acp"
- ammo_type = /obj/item/ammo_casing/c32acp
- caliber = "c32acp"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/m32acp/empty
- start_empty = 1
diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm
index 4bd7d34fe2..dbf249b3f8 100644
--- a/code/modules/projectiles/guns/ballistic/bow.dm
+++ b/code/modules/projectiles/guns/ballistic/bow.dm
@@ -59,7 +59,7 @@
/obj/item/gun/ballistic/bow/pipe
name = "pipe bow"
- desc = "Some sort of pipe made projectile weapon made of a durathread string and lots of bending. Used to fire arrows."
+ desc = "Some sort of pipe-based projectile weapon made of string and lots of bending. Used to fire arrows."
icon_state = "pipebow"
item_state = "pipebow"
- force = 0
+ force = 2
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 319ec16345..cdaadb5c3b 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -156,19 +156,3 @@
name = "Syndicate Anti Tank Pistol"
desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate a variety of joints without proper bracing."
pin = /obj/item/firing_pin/implant/pindicate
-
-////////////Improvised Pistol////////////
-
-/obj/item/gun/ballistic/automatic/pistol/improvised
- name = "Improvised Pistol"
- desc = "An improvised pocket-sized pistol that fires .32 calibre rounds. It looks incredibly flimsy."
- icon_state = "ipistol"
- item_state = "pistol"
- mag_type = /obj/item/ammo_box/magazine/m32acp
- fire_delay = 7.5
- can_suppress = FALSE
- w_class = WEIGHT_CLASS_SMALL
- spread = 15 // Keep the spread between 15 and 20. This hardlocks it into being a mid-range pistol, the magazine size means you're allowed to miss. Fills the mid-range niche that slugs/rifle and buckshot doesn't fill.
-
-/obj/item/gun/ballistic/automatic/pistol/improvised/nomag
- spawnwithmagazine = FALSE // For crafting as you shouldn't get eight bullets for free otherwise people will reaper reload.
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index f34dbc6abc..289b43a669 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -319,11 +319,11 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised
name = "improvised shotgun"
- desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction will probably result in it hurting people less than a normal shotgun."
+ desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction shows in its lesser effectiveness."
icon_state = "ishotgun"
item_state = "shotgun"
w_class = WEIGHT_CLASS_BULKY
- weapon_weight = WEAPON_MEDIUM
+ weapon_weight = WEAPON_MEDIUM // prevents shooting 2 at once, but doesn't require 2 hands
force = 10
slot_flags = null
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised
@@ -331,12 +331,11 @@
unique_reskin = null
projectile_damage_multiplier = 0.9
var/slung = FALSE
- weapon_weight = WEAPON_HEAVY
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
- if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
+ if(A.use_tool(src, user, 0, 10, skill_gain_mult = EASY_USE_TOOL_MULT))
slot_flags = ITEM_SLOT_BACK
to_chat(user, "You tie the lengths of cable to the shotgun, making a sling.")
slung = TRUE
@@ -358,7 +357,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn
name = "sawn-off improvised shotgun"
- desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You still need two hands to fire this, if you value unbroken wrists."
+ desc = "The barrel and stock have been sawn and filed down; it can fit in backpacks. You wont want to shoot two of these at once if you value your wrists."
icon_state = "ishotgun"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index a4a4065959..873b129c8f 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -156,7 +156,7 @@
/obj/item/gun/ballistic/shotgun/boltaction/improvised/attackby(obj/item/A, mob/user, params)
..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_off)
- if(A.use_tool(src, user, 0, 10, max_level = JOB_SKILL_BASIC))
+ if(A.use_tool(src, user, 0, 10, skill_gain_mult = EASY_USE_TOOL_MULT))
slot_flags = ITEM_SLOT_BACK
to_chat(user, "You tie the lengths of cable to the rifle, making a sling.")
slung = TRUE
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index e64da116f3..72ac9620b5 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -240,20 +240,3 @@
chambered.BB.damage *= 5
process_fire(target, user, TRUE, params)
-
-////////////////
-// IMPROVISED //
-////////////////
-
-/obj/item/gun/energy/e_gun/old/improvised
- name = "improvised energy rifle"
- desc = "A crude imitation of an energy gun. It works, however the beams are poorly focused and most of the energy is wasted before it reaches the target. Welp, it still burns things."
- icon_state = "improvised"
- ammo_x_offset = 1
- shaded_charge = 1
- ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised)
-
-/obj/item/gun/energy/e_gun/old/improvised/upgraded
- name = "makeshift energy rifle"
- desc = "The new lens and upgraded parts gives this a higher capacity and more energy output, however, the shoddy construction still leaves it inferior to Nanotrasen's own energy weapons."
- ammo_type = list(/obj/item/ammo_casing/energy/lasergun/improvised/upgraded)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d95c3b5028..2f12f0f69b 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -39,9 +39,6 @@
/obj/item/projectile/beam/weak
damage = 15
-/obj/item/projectile/beam/weak/improvised
- damage = 10
-
/obj/item/projectile/beam/weak/penetrator
armour_penetration = 50
diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm
index 62ff4adb11..38c9c9f7d9 100644
--- a/code/modules/projectiles/projectile/bullets/pistol.dm
+++ b/code/modules/projectiles/projectile/bullets/pistol.dm
@@ -48,15 +48,3 @@
L.Sleeping(300)
else
L.adjustStaminaLoss(25)
-
-// .32 ACP (Improvised Pistol)
-
-/obj/item/projectile/bullet/c32acp
- name = ".32 bullet"
- damage = 13
-
-/obj/item/projectile/bullet/r32acp
- name = ".32 rubber bullet"
- damage = 3
- eyeblur = 1
- stamina = 20
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 52fd89e37c..f0900796c6 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -132,8 +132,8 @@
"You're covered in boiling oil!")
M.emote("scream")
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
- var/oil_damage = (holder.chem_temp / fry_temperature) * 0.33 //Damage taken per unit
- M.adjustFireLoss(min(35, oil_damage * reac_volume)) //Damage caps at 35
+ var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
+ M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20
else
..()
return TRUE
@@ -866,4 +866,4 @@
taste_mult = 2
taste_description = "fizzy sweetness"
value = REAGENT_VALUE_COMMON
-
\ No newline at end of file
+
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
index 9768d80a59..61d0594d3b 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm
@@ -30,14 +30,6 @@
build_path = /obj/item/ammo_box/c38
category = list("initial", "Security")
-/datum/design/r32acp
- name = "Rubber Pistol Bullet (.32)"
- id = "r32acp"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 250)
- build_path = /obj/item/ammo_casing/r32acp
- category = list("initial", "Security")
-
/////////////////
///Hacked Gear //
/////////////////
@@ -206,22 +198,3 @@
build_path = /obj/item/clothing/head/foilhat
category = list("hacked", "Misc")
-/datum/design/c32acp
- name = "Pistol Bullet (.32)"
- id = "c32acp"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 500)
- build_path = /obj/item/ammo_casing/c32acp
- category = list("hacked", "Security")
-
-/////////////////
-// Magazines //
-/////////////////
-
-/datum/design/m32acp
- name = "Empty .32 Magazine"
- id = "m32acp"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 10000)
- build_path = /obj/item/ammo_box/magazine/m32acp/empty
- category = list("hacked", "Security")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
index 3c9c8f9aca..539232bbcd 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm
@@ -289,11 +289,3 @@
materials = list(/datum/material/iron = 6500, /datum/material/glass = 50)
build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly
category = list("initial", "Misc")
-
-/datum/design/focusing_lens
- name = "Makeshift Lens"
- id = "makeshift_lens"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 2000, /datum/material/glass = 4000)
- build_path = /obj/item/weaponcrafting/improvised_parts/makeshift_lens
- category = list("initial", "Misc")
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
index 1bb18482f3..bebf836ce0 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
@@ -158,11 +158,3 @@
materials = list(/datum/material/iron = 150, /datum/material/glass = 150)
build_path = /obj/item/geiger_counter
category = list("initial", "Tools")
-
-/datum/design/saw
- name = "Hand Saw"
- id = "handsaw"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 500)
- build_path = /obj/item/hatchet/saw
- category = list("initial", "Tools")
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index b7dfa3eb88..b42770723b 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -132,6 +132,7 @@
"You extend [holder] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
+ return TRUE
/obj/item/organ/cyberimp/arm/ui_action_click()
if(crit_fail || (organ_flags & ORGAN_FAILING) || (!holder && !contents.len))
@@ -273,12 +274,29 @@
desc = "A deployable riot shield to help deal with civil unrest."
contents = newlist(/obj/item/shield/riot/implant)
-/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I)
+/obj/item/organ/cyberimp/arm/shield/Extend(obj/item/I, silent = FALSE)
if(I.obj_integrity == 0) //that's how the shield recharge works
- to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
+ if(!silent)
+ to_chat(owner, "[I] is still too unstable to extend. Give it some time!")
return FALSE
return ..()
+/obj/item/organ/cyberimp/arm/shield/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
+ . = ..()
+ if(.)
+ RegisterSignal(M, COMSIG_LIVING_ACTIVE_BLOCK_START, .proc/on_signal)
+
+/obj/item/organ/cyberimp/arm/shield/Remove(special = FALSE)
+ UnregisterSignal(owner, COMSIG_LIVING_ACTIVE_BLOCK_START)
+ return ..()
+
+/obj/item/organ/cyberimp/arm/shield/proc/on_signal(datum/source, obj/item/blocking_item, list/other_items)
+ if(!blocking_item) //if they don't have something
+ var/obj/item/shield/S = locate() in contents
+ if(!Extend(S, TRUE))
+ return
+ other_items += S
+
/obj/item/organ/cyberimp/arm/shield/emag_act()
. = ..()
if(obj_flags & EMAGGED)
diff --git a/html/changelogs/AutoChangeLog-pr-12593.yml b/html/changelogs/AutoChangeLog-pr-12593.yml
new file mode 100644
index 0000000000..97e505ad86
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12593.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "auto bunker override verb has been added"
diff --git a/html/changelogs/AutoChangeLog-pr-12650.yml b/html/changelogs/AutoChangeLog-pr-12650.yml
new file mode 100644
index 0000000000..f0187f97c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12650.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "active blocking now has a toggle keybind"
diff --git a/html/changelogs/AutoChangeLog-pr-12651.yml b/html/changelogs/AutoChangeLog-pr-12651.yml
new file mode 100644
index 0000000000..018674e83a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12651.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - balance: "shields take 2.5 stam instead of 3.5 stam per second to maintain block"
diff --git a/html/changelogs/AutoChangeLog-pr-12652.yml b/html/changelogs/AutoChangeLog-pr-12652.yml
new file mode 100644
index 0000000000..8afd951deb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12652.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "Cybernetic implant shields will auto-extend and be used to block if the user has no item to block with"
diff --git a/html/changelogs/AutoChangeLog-pr-12658.yml b/html/changelogs/AutoChangeLog-pr-12658.yml
new file mode 100644
index 0000000000..593cc48c54
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12658.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - tweak: "cooking oil is now far less lethal, requiring a higher volume of the reagent to deal more damage"
diff --git a/html/changelogs/AutoChangeLog-pr-12660.yml b/html/changelogs/AutoChangeLog-pr-12660.yml
new file mode 100644
index 0000000000..6e82ac9553
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12660.yml
@@ -0,0 +1,7 @@
+author: "Yakumo Chen, kappa-sama"
+delete-after: True
+changes:
+ - rscdel: "Removes improvised handguns"
+ - rscdel: "removed handsaws, improvised gun barrels (you can use atmos pipes again)"
+ - balance: "Guncrafting is less time and resource intensive"
+ - tweak: "Item names in guncrafting are user-friendly."
diff --git a/html/changelogs/AutoChangeLog-pr-12662.yml b/html/changelogs/AutoChangeLog-pr-12662.yml
new file mode 100644
index 0000000000..a7401a308f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12662.yml
@@ -0,0 +1,6 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - rscadd: "cloth string to replace durathread string"
+ - rscdel: "durathread string"
+ - balance: "All bows and arrows have had crafting times significantly reduced, coming out at up to 6 times faster crafting speeds. Improvised bows no longer require durathread; instead, they use cloth materials."
diff --git a/html/changelogs/AutoChangeLog-pr-12677.yml b/html/changelogs/AutoChangeLog-pr-12677.yml
new file mode 100644
index 0000000000..769426f492
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12677.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "You can now actually gain wiring experience from using cable coils."
diff --git a/html/changelogs/AutoChangeLog-pr-12685.yml b/html/changelogs/AutoChangeLog-pr-12685.yml
new file mode 100644
index 0000000000..09f58d55c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12685.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Opening the View Skill Panel shouldn't trigger messages about insufficient admin priviledges anymore."
diff --git a/tgstation.dme b/tgstation.dme
index b1b1c88604..a22a7cb729 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1150,7 +1150,6 @@
#include "code\game\objects\items\tanks\tanks.dm"
#include "code\game\objects\items\tanks\watertank.dm"
#include "code\game\objects\items\tools\crowbar.dm"
-#include "code\game\objects\items\tools\saw.dm"
#include "code\game\objects\items\tools\screwdriver.dm"
#include "code\game\objects\items\tools\weldingtool.dm"
#include "code\game\objects\items\tools\wirecutters.dm"
@@ -1805,6 +1804,7 @@
#include "code\modules\client\preferences_toggles.dm"
#include "code\modules\client\preferences_vr.dm"
#include "code\modules\client\verbs\aooc.dm"
+#include "code\modules\client\verbs\autobunker.dm"
#include "code\modules\client\verbs\etips.dm"
#include "code\modules\client\verbs\looc.dm"
#include "code\modules\client\verbs\minimap.dm"
@@ -2415,7 +2415,6 @@
#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\life.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm"