From 075cb673c09ad2db4655d594bf43d70c46d765c1 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 7 Oct 2017 13:36:33 -0400 Subject: [PATCH] Remove drop_item, drop_item_v, put_in_hands_or_del --- code/_onclick/hud/screen_objects.dm | 3 +- .../datums/diseases/advance/symptoms/cough.dm | 41 ++ code/datums/martial/cqc.dm | 7 +- code/datums/martial/krav_maga.dm | 2 +- code/datums/martial/sleeping_carp.dm | 9 +- code/datums/mutations.dm | 2 +- code/datums/wires/wires.dm | 5 +- code/game/gamemodes/antag_spawner.dm | 2 +- .../gamemodes/changeling/powers/mutations.dm | 7 +- .../gamemodes/changeling/powers/tiny_prick.dm | 5 +- .../clock_effects/spatial_gateway.dm | 2 +- .../clock_items/clock_components.dm | 1 - .../clock_items/clock_weapons/_call_weapon.dm | 1 - .../clock_cult/clock_items/clockwork_slab.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 7 +- .../gamemodes/devil/true_devil/_true_devil.dm | 2 +- .../miniantags/abduction/abduction_surgery.dm | 2 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- .../miniantags/slaughter/slaughter.dm | 2 +- code/game/gamemodes/nuclear/nuclear.dm | 5 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 9 +- code/game/gamemodes/wizard/artefact.dm | 4 +- code/game/gamemodes/wizard/wizard.dm | 2 +- code/game/machinery/PDApainter.dm | 56 +++ code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/camera/camera_assembly.dm | 3 +- .../machinery/computer/gulag_teleporter.dm | 15 +- code/game/machinery/computer/medical.dm | 17 +- code/game/machinery/computer/prisoner.dm | 7 +- code/game/machinery/computer/security.dm | 15 +- .../machinery/computer/telecrystalconsoles.dm | 10 +- code/game/machinery/constructable_frame.dm | 239 +++++++++++ code/game/machinery/doors/airlock.dm | 3 +- code/game/machinery/doors/firedoor.dm | 1 - code/game/machinery/flasher.dm | 3 +- code/game/machinery/gulag_item_reclaimer.dm | 18 +- code/game/machinery/iv_drip.dm | 4 +- code/game/machinery/newscaster.dm | 8 +- code/game/machinery/pipe/pipe_dispenser.dm | 2 - .../porta_turret/portable_turret_construct.dm | 5 +- code/game/machinery/recharger.dm | 3 +- code/game/machinery/slotmachine.dm | 5 +- code/game/machinery/spaceheater.dm | 17 +- code/game/machinery/suit_storage_unit.dm | 9 +- code/game/machinery/syndicatebomb.dm | 6 +- code/game/machinery/vending.dm | 6 +- code/game/mecha/mecha_defense.dm | 5 +- .../effects/effect_system/effects_smoke.dm | 3 +- code/game/objects/items.dm | 2 +- code/game/objects/items/handcuffs.dm | 377 ++++++++++++++++- code/game/objects/items/melee/misc.dm | 6 +- code/game/objects/items/paiwire.dm | 15 + code/game/objects/items/pneumaticCannon.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 2 +- code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/storage/boxes.dm | 6 +- code/game/objects/items/toys.dm | 8 +- code/game/objects/structures.dm | 44 ++ .../objects/structures/beds_chairs/chair.dm | 4 +- code/game/objects/structures/bedsheet_bin.dm | 9 +- .../structures/crates_lockers/closets.dm | 3 +- code/game/objects/structures/door_assembly.dm | 3 +- code/game/objects/structures/extinguisher.dm | 3 +- code/game/objects/structures/fireaxe.dm | 3 +- code/game/objects/structures/girders.dm | 3 +- code/game/objects/structures/guncase.dm | 3 +- code/game/objects/structures/janicart.dm | 3 +- code/game/objects/structures/safe.dm | 3 +- code/game/objects/structures/signs.dm | 1 - code/game/objects/structures/tables_racks.dm | 10 +- .../game/objects/structures/tank_dispenser.dm | 3 +- code/game/objects/structures/target_stake.dm | 49 +++ code/game/objects/structures/watercloset.dm | 6 +- .../objects/structures/windoor_assembly.dm | 3 +- .../game/turfs/simulated/floor/light_floor.dm | 2 +- code/modules/assembly/bomb.dm | 12 +- .../components/unary_devices/cryo.dm | 3 +- .../portable/portable_atmospherics.dm | 3 +- .../awaymissions/mission_code/Academy.dm | 2 +- code/modules/clothing/clothing.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 9 +- .../kitchen_machinery/deep_fryer.dm | 3 +- .../kitchen_machinery/food_cart.dm | 5 +- .../kitchen_machinery/microwave.dm | 3 +- .../kitchen_machinery/processor.dm | 3 +- code/modules/food_and_drinks/pizzabox.dm | 6 +- code/modules/holodeck/items.dm | 6 +- code/modules/hydroponics/biogenerator.dm | 3 +- code/modules/hydroponics/gene_modder.dm | 10 +- code/modules/hydroponics/grown/cereals.dm | 3 +- code/modules/hydroponics/grown/nettle.dm | 2 +- code/modules/hydroponics/seed_extractor.dm | 155 +++++++ code/modules/library/lib_items.dm | 3 +- code/modules/library/lib_machines.dm | 6 +- code/modules/mining/fulton.dm | 3 +- code/modules/mining/laborcamp/laborstacker.dm | 103 +++++ .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mining/machine_redemption.dm | 3 +- code/modules/mining/machine_vending.dm | 6 +- code/modules/mining/satchel_ore_boxdm.dm | 4 +- code/modules/mob/inventory.dm | 20 +- code/modules/mob/living/brain/brain_item.dm | 3 +- .../carbon/alien/humanoid/humanoid_defense.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../mob/living/carbon/human/interactive.dm | 2 +- .../mob/living/carbon/human/species.dm | 2 +- .../living/carbon/monkey/monkey_defense.dm | 16 +- .../modules/mob/living/silicon/robot/robot.dm | 8 +- code/modules/mob/living/silicon/silicon.dm | 386 ++++++++++++++++++ .../mob/living/simple_animal/bot/bot.dm | 3 +- .../mob/living/simple_animal/bot/medbot.dm | 3 +- .../mob/living/simple_animal/bot/mulebot.dm | 6 +- .../mob/living/simple_animal/friendly/dog.dm | 13 +- .../simple_animal/friendly/farm_animals.dm | 1 - .../mob/living/simple_animal/parrot.dm | 5 +- code/modules/mob/mob_movement.dm | 9 +- .../file_system/programs/card.dm | 6 +- .../modular_computers/laptop_vendor.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 3 +- code/modules/paperwork/paper_cutter.dm | 5 +- code/modules/paperwork/photocopier.dm | 10 +- code/modules/power/apc.dm | 3 +- code/modules/power/lighting.dm | 2 +- code/modules/power/singularity/collector.dm | 5 +- code/modules/power/solar.dm | 2 +- code/modules/projectiles/box_magazine.dm | 3 +- code/modules/projectiles/gun.dm | 2 +- .../projectiles/guns/ballistic/revolver.dm | 2 +- .../projectiles/guns/ballistic/shotgun.dm | 4 +- .../projectiles/guns/misc/blastcannon.dm | 3 +- .../chemistry/reagents/drug_reagents.dm | 8 +- .../chemistry/reagents/food_reagents.dm | 2 - .../chemistry/reagents/medicine_reagents.dm | 21 +- code/modules/recycling/conveyor2.dm | 3 +- code/modules/recycling/disposal-unit.dm | 2 +- code/modules/research/destructive_analyzer.dm | 3 +- code/modules/research/experimentor.dm | 3 +- code/modules/research/rdconsole.dm | 3 +- .../research/xenobiology/xenobio_camera.dm | 1 - code/modules/spells/spell_types/conjure.dm | 5 +- code/modules/spells/spell_types/devil.dm | 2 +- .../modules/spells/spell_types/devil_boons.dm | 2 +- .../spells/spell_types/infinite_guns.dm | 5 +- code/modules/surgery/cavity_implant.dm | 3 +- code/modules/surgery/dental_implant.dm | 3 +- code/modules/surgery/limb_augmentation.dm | 61 +++ code/modules/surgery/organ_manipulation.dm | 2 +- code/modules/surgery/organs/autosurgeon.dm | 3 +- code/modules/surgery/organs/heart.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 5 +- .../modules/surgery/prosthetic_replacement.dm | 3 +- code/modules/vehicles/pimpin_ride.dm | 3 +- 152 files changed, 1778 insertions(+), 425 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 397e04a4f5..9730aaf552 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -196,7 +196,8 @@ plane = HUD_PLANE /obj/screen/drop/Click() - usr.drop_item_v() + if(usr.stat == CONSCIOUS) + usr.dropItemToGround(usr.get_active_held_item()) /obj/screen/act_intent name = "intent" diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 95577fe351..6b84e88dfb 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -34,6 +34,7 @@ BONUS Stage Speed 6: Increases cough frequency.
\ If Airborne: Coughing will infect bystanders.
\ Stealth 4: The symptom remains hidden until active." +<<<<<<< HEAD /datum/symptom/cough/Start(datum/disease/advance/A) ..() @@ -72,3 +73,43 @@ BONUS if(infective) A.spread(1) +======= + +/datum/symptom/cough/Start(datum/disease/advance/A) + ..() + if(A.properties["stealth"] >= 4) + suppress_warning = TRUE + if(A.spread_flags &= AIRBORNE) //infect bystanders + infective = TRUE + if(A.properties["resistance"] >= 3) //strong enough to drop items + power = 1.5 + if(A.properties["resistance"] >= 10) //strong enough to stun (rarely) + power = 2 + if(A.properties["stage_rate"] >= 6) //cough more often + symptom_delay_max = 10 + +/datum/symptom/cough/Activate(datum/disease/advance/A) + if(!..()) + return + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + if(prob(base_message_chance) && !suppress_warning) + to_chat(M, "[pick("You swallow excess mucus.", "You lightly cough.")]") + else + M.emote("cough") + if(power >= 1.5) + var/obj/item/I = M.get_active_held_item() + if(I && I.w_class == WEIGHT_CLASS_TINY) + M.dropItemToGround(I) + if(power >= 2 && prob(10)) + to_chat(M, "[pick("You have a coughing fit!", "You can't stop coughing!")]") + M.Stun(20) + M.emote("cough") + addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6) + addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12) + addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18) + if(infective) + A.spread(1) + +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index d740a4213c..8974c388b1 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -85,7 +85,7 @@ "[A] strikes your abdomen, neck and back consecutively!") playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1) var/obj/item/I = D.get_active_held_item() - if(I && D.drop_item()) + if(I && D.temporarilyRemoveItemFromInventory(I)) A.put_in_hands(I) D.adjustStaminaLoss(50) D.apply_damage(25, BRUTE) @@ -145,7 +145,7 @@ D.visible_message("[A] strikes [D]'s jaw with their hand!", \ "[A] strikes your jaw, disorienting you!") playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1) - if(I && D.drop_item()) + if(I && D.temporarilyRemoveItemFromInventory(I)) A.put_in_hands(I) D.Jitter(2) D.apply_damage(5, BRUTE) @@ -193,7 +193,6 @@ to_chat(user, "You remember the basics of CQC.") var/datum/martial_art/cqc/D = new(null) D.teach(user) - user.drop_item() visible_message("[src] beeps ominously, and a moment later it bursts up in flames.") - new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) + new /obj/effect/decal/cleanable/ash(user.drop_location()) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 84f0f00e45..a898c1866b 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -150,7 +150,7 @@ if(prob(60)) I = D.get_active_held_item() if(I) - if(D.drop_item()) + if(D.temporarilyRemoveItemFromInventory(I)) A.put_in_hands(I) D.visible_message("[A] has disarmed [D]!", \ "[A] has disarmed [D]!") diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index ac5083cc17..8fe8fcd366 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -41,7 +41,7 @@ "[A] grabs your wrist and violently wrenches it to the side!") playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) D.emote("scream") - D.drop_item() + D.dropItemToGround(D.get_active_held_item()) D.apply_damage(5, BRUTE, pick("l_arm", "r_arm")) D.Stun(60) return 1 @@ -79,7 +79,7 @@ D.visible_message("[A] kicks [D] in the head!", \ "[A] kicks you in the jaw!") D.apply_damage(20, BRUTE, "head") - D.drop_item() + D.drop_all_held_items() playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) D.Stun(80) return 1 @@ -168,10 +168,9 @@ to_chat(user, message) var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) theSleepingCarp.teach(user) - user.drop_item() - visible_message("[src] lights up in fire and quickly burns to ash.") - new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) + visible_message("[src] lights up in fire and quickly burns to ash.") + new /obj/effect/decal/cleanable/ash(user.drop_location()) /obj/item/twohanded/bostaff name = "bo staff" diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 4e8ae4e73a..dea7a7308a 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -270,7 +270,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/cough/on_life(mob/living/carbon/human/owner) if(prob(5) && owner.stat == CONSCIOUS) - owner.drop_item() + owner.drop_all_held_items() owner.emote("cough") /datum/mutation/human/dwarfism diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index ae938f18ce..c508907bf4 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -250,9 +250,10 @@ if(istype(I, /obj/item/device/assembly)) var/obj/item/device/assembly/A = I if(A.attachable) - if(!L.drop_item()) + if(!L.temporarilyRemoveItemFromInventory(A)) return - attach_assembly(target_wire, A) + if(!attach_assembly(target_wire, A)) + A.forceMove(L.drop_location()) . = TRUE else to_chat(L, "You need an attachable assembly!") diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 3b5b862559..c529ab546d 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -90,7 +90,7 @@ if("healing") M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - M.put_in_hands_or_del(new /obj/item/gun/magic/staff/healing(M)) + M.put_in_hands(new /obj/item/gun/magic/staff/healing(M), TRUE) to_chat(M, "Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.") if("robeless") M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index addca91629..467d23e726 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -37,8 +37,9 @@ return 1 /obj/effect/proc_holder/changeling/weapon/sting_action(mob/living/user) - if(!user.drop_item()) - to_chat(user, "The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!") + var/obj/item/held = user.get_active_held_item() + if(held && !user.dropItemToGround(held)) + to_chat(user, "[held] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!") return var/limb_regen = 0 if(user.active_hand_index % 2 == 0) //we regen the arm before changing it into the weapon @@ -338,7 +339,7 @@ if(INTENT_DISARM) var/obj/item/I = C.get_active_held_item() if(I) - if(C.drop_item()) + if(C.dropItemToGround(I)) C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") on_hit(I) //grab the item as if you had hit it directly with the tentacle return 1 diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 1732e98630..e98898f37c 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -127,8 +127,9 @@ /obj/effect/proc_holder/changeling/sting/false_armblade/sting_action(mob/user, mob/target) add_logs(user, target, "stung", object="falso armblade sting") - if(!target.drop_item()) - to_chat(user, "The [target.get_active_held_item()] is stuck to their hand, you cannot grow a false armblade over it!") + var/obj/item/held = target.get_active_held_item() + if(held && !target.dropItemToGround(held)) + to_chat(user, "[held] is stuck to their hand, you cannot grow a false armblade over it!") return if(ismonkey(target)) diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm index 9b1ef66c9e..8f8a4bfcbf 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm @@ -88,7 +88,7 @@ if(istype(I, /obj/item/clockwork/slab)) to_chat(user, "\"I don't think you want to drop your slab into that.\"\n\"If you really want to, try throwing it.\"") return TRUE - if(user.drop_item() && uses) + if(uses && user.dropItemToGround(I)) user.visible_message("[user] drops [I] into [src]!", "You drop [I] into [src]!") pass_through_gateway(I, TRUE) return TRUE diff --git a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm index b1409aae18..65c4f9f0af 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm @@ -20,7 +20,6 @@ "You crush [src], capturing its escaping energy for use as power.") playsound(user, 'sound/effects/pop_expl.ogg', 50, TRUE) adjust_clockwork_power(POWER_WALL_TOTAL) - user.drop_item() qdel(src) /obj/item/clockwork/component/pickup(mob/living/user) diff --git a/code/game/gamemodes/clock_cult/clock_items/clock_weapons/_call_weapon.dm b/code/game/gamemodes/clock_cult/clock_items/clock_weapons/_call_weapon.dm index afe6aca217..a87767c05e 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clock_weapons/_call_weapon.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clock_weapons/_call_weapon.dm @@ -28,7 +28,6 @@ if(weapon.loc == owner) owner.visible_message("[owner]'s [weapon.name] flickers and disappears!") to_chat(owner, "You dismiss [weapon].") - owner.drop_item() QDEL_NULL(weapon) weapon_reset(RATVARIAN_SPEAR_COOLDOWN * 0.5) return diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index a9c241b2c3..563e83e9cd 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -136,7 +136,7 @@ to_chat(user, "\"You reek of blood. You've got a lot of nerve to even look at that slab.\"") user.visible_message("A sizzling sound comes from [user]'s hands!", "[src] suddenly grows extremely hot in your hands!") playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1) - user.drop_item() + user.dropItemToGround(src) user.emote("scream") user.apply_damage(5, BURN, "l_arm") user.apply_damage(5, BURN, "r_arm") diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 2a5f64915b..115f931975 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -21,7 +21,6 @@ if(invoke(user)) uses-- if(uses <= 0) - user.drop_item() qdel(src) /obj/item/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1) @@ -182,7 +181,6 @@ C.Jitter(15) if(is_servant_of_ratvar(target)) target.adjustBruteLoss(15) - user.drop_item() qdel(src) return ..() @@ -204,13 +202,13 @@ user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) user.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back) - user.drop_item() + user.dropItemToGround(src) user.put_in_hands(new /obj/item/melee/cultblade(user)) user.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user)) /obj/item/paper/talisman/armor/attack(mob/living/target, mob/living/user) if(iscultist(user) && iscultist(target)) - user.drop_item() + user.temporarilyRemoveItemFromInventory(src) invoke(target) qdel(src) return @@ -335,7 +333,6 @@ else to_chat(user, "[C] is already bound.") if(uses <= 0) - user.drop_item() qdel(src) /obj/item/restraints/handcuffs/energy/cult //For the talisman of shackling diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 5b85cbd811..9b24d096c4 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -184,7 +184,7 @@ "[M] has pushed down [src]!") else if (prob(25)) - drop_item() + dropItemToGround(get_active_held_item()) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) visible_message("[M] has disarmed [src]!", \ "[M] has disarmed [src]!") diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 879f68e960..5b5bafdd21 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -49,7 +49,7 @@ /datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target].") - user.drop_item() + user.temporarilyRemoveItemFromInventory(tool, TRUE) var/obj/item/organ/heart/gland/gland = tool gland.Insert(target, 2) return 1 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 5e1d80e175..e72babc5b0 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -353,7 +353,7 @@ return ..() user.visible_message("[user] scatters [src] in all directions.", \ "You scatter [src] across the area. The particles slowly fade away.") - user.drop_item() + user.dropItemToGround(src) scatter() /obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom) diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 7aba0adf26..b9a07093d3 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -97,7 +97,7 @@ return user.visible_message("[user]'s eyes flare a deep crimson!", \ "You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!") - user.drop_item() + user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E /obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 2179177fc1..a24efbe3f5 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -91,7 +91,7 @@ to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge - synd_mind.current.put_in_hands_or_del(challenge) + synd_mind.current.put_in_hands(challenge, TRUE) var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id) if(foundIDs.len) @@ -110,8 +110,7 @@ P.info = "The nuclear authorization code is: [nuke_code]" P.name = "nuclear bomb code" var/mob/living/carbon/human/H = synd_mind.current - P.forceMove(H.drop_location()) - H.put_in_hands_or_del(P) + H.put_in_hands(P, TRUE) H.update_icons() else nuke_code = "code will be provided later" diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 8870399f24..8cae25eb38 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -105,9 +105,8 @@ /obj/machinery/nuclearbomb/attackby(obj/item/I, mob/user, params) if (istype(I, /obj/item/disk/nuclear)) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.forceMove(src) auth = I add_fingerprint(user) return @@ -309,10 +308,8 @@ . = TRUE if("insert_disk") if(!auth) - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/disk/nuclear)) - usr.drop_item() - I.forceMove(src) + var/obj/item/I = usr.is_holding_item_of_type(/obj/item/disk/nuclear) + if(I && usr.transferItemToLoc(I, src)) auth = I . = TRUE if("keypad") diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 42d676c29b..ced6ebbd35 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -193,8 +193,8 @@ H.equip_to_slot_or_del(new hat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes) - H.put_in_hands_or_del(new /obj/item/shield/riot/roman(H)) - H.put_in_hands_or_del(new /obj/item/claymore(H)) + H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) + H.put_in_hands(new /obj/item/claymore(H), TRUE) H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index dee9ab4a3d..fb9fb31fff 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -159,7 +159,7 @@ wizard_mob.equip_to_slot_or_del(new /obj/item/teleportation_scroll(wizard_mob), slot_r_store) var/obj/item/spellbook/spellbook = new /obj/item/spellbook(wizard_mob) spellbook.owner = wizard_mob - wizard_mob.put_in_hands_or_del(spellbook) + wizard_mob.put_in_hands(spellbook, TRUE) to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.") to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.") diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index bd84e7a464..9721fb6ee1 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -46,6 +46,7 @@ /obj/machinery/pdapainter/Destroy() QDEL_NULL(storedpda) +<<<<<<< HEAD return ..() /obj/machinery/pdapainter/on_deconstruction() @@ -103,6 +104,61 @@ return ..() /obj/machinery/pdapainter/deconstruct(disassembled = TRUE) +======= + return ..() + +/obj/machinery/pdapainter/on_deconstruction() + if(storedpda) + storedpda.forceMove(loc) + storedpda = null + +/obj/machinery/pdapainter/contents_explosion(severity, target) + if(storedpda) + storedpda.ex_act(severity, target) + +/obj/machinery/pdapainter/handle_atom_del(atom/A) + if(A == storedpda) + storedpda = null + update_icon() + +/obj/machinery/pdapainter/attackby(obj/item/O, mob/user, params) + if(default_unfasten_wrench(user, O)) + power_change() + return + + else if(istype(O, /obj/item/device/pda)) + if(storedpda) + to_chat(user, "There is already a PDA inside!") + return + else if(!user.transferItemToLoc(O, src)) + return + storedpda = O + O.add_fingerprint(user) + update_icon() + + else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) + var/obj/item/weldingtool/WT = O + if(stat & BROKEN) + if(WT.remove_fuel(0,user)) + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + playsound(loc, WT.usesound, 40, 1) + if(do_after(user,40*WT.toolspeed, 1, target = src)) + if(!WT.isOn() || !(stat & BROKEN)) + return + to_chat(user, "You repair [src].") + playsound(loc, 'sound/items/welder2.ogg', 50, 1) + stat &= ~BROKEN + obj_integrity = max_integrity + update_icon() + else + to_chat(user, "[src] does not need repairs.") + else + return ..() + +/obj/machinery/pdapainter/deconstruct(disassembled = TRUE) +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) if(!(flags_1 & NODECONSTRUCT_1)) if(!(stat & BROKEN)) stat |= BROKEN diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7d3c40a0d9..80d50cfb17 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -149,10 +149,10 @@ else if(istype(W, /obj/item/device/analyzer)) if(!isXRay()) - if(!user.drop_item(W)) + if(!user.temporarilyRemoveItemFromInventory(W)) return - upgradeXRay() qdel(W) + upgradeXRay() to_chat(user, "[msg]") else to_chat(user, "[msg2]") diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 1e6fe4c532..5b828af820 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -109,11 +109,10 @@ // Upgrades! if(is_type_in_typecache(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already. - if(!user.drop_item(W)) + if(!user.transferItemToLoc(W, src)) return to_chat(user, "You attach \the [W] into the assembly inner circuits.") upgrades += W - W.forceMove(src) return // Taking out upgrades diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm index d80dc73f15..b1d56f2b2e 100644 --- a/code/game/machinery/computer/gulag_teleporter.dm +++ b/code/game/machinery/computer/gulag_teleporter.dm @@ -92,18 +92,13 @@ beacon = findbeacon() if("handle_id") if(id) - if(!usr.get_active_held_item()) - usr.put_in_hands(id) - id = null - else - id.forceMove(get_turf(src)) - id = null + usr.put_in_hands(id) + id = null else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/card/id/prisoner)) - if(!usr.drop_item()) + var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner) + if(I) + if(!usr.transferItemToLoc(I, src)) return - I.forceMove(src) id = I if("set_goal") var/new_goal = input("Set the amount of points:", "Points", id.goal) as num|null diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 6ec144d257..f13cfe8c00 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -27,9 +27,8 @@ /obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/card/id) && !scan) - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) return - O.loc = src scan = O to_chat(user, "You insert [O].") else @@ -215,17 +214,13 @@ src.temp = null if(href_list["scan"]) if(src.scan) - if(ishuman(usr) && !usr.get_active_held_item()) - usr.put_in_hands(scan) - else - scan.loc = get_turf(src) - src.scan = null + usr.put_in_hands(scan) + scan = null else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/card/id)) - if(!usr.drop_item()) + var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id) + if(I) + if(!usr.transferItemToLoc(I, src)) return - I.loc = src src.scan = I else if(href_list["logout"]) src.authenticated = null diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index a7626258ae..c983bc319f 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -90,11 +90,10 @@ if(href_list["id"]) if(href_list["id"] =="insert" && !inserted_id) - var/obj/item/card/id/prisoner/I = usr.get_active_held_item() - if(istype(I)) - if(!usr.drop_item()) + var/obj/item/card/id/prisoner/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner) + if(I) + if(!usr.transferItemToLoc(I, src)) return - I.loc = src inserted_id = I else to_chat(usr, "No valid ID.") else if(inserted_id) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 1a74c44c30..7fadcac2f2 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -37,9 +37,8 @@ /obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/card/id)) if(!scan) - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) return - O.loc = src scan = O to_chat(user, "You insert [O].") else @@ -303,17 +302,13 @@ What a mess.*/ if("Confirm Identity") if(scan) - if(ishuman(usr) && !usr.get_active_held_item()) - usr.put_in_hands(scan) - else - scan.loc = get_turf(src) + usr.put_in_hands(scan) scan = null else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/card/id)) - if(!usr.drop_item()) + var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id) + if(I) + if(!usr.transferItemToLoc(I, src)) return - I.loc = src scan = I if("Log Out") diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 52de3830df..eb6c2902e8 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -29,21 +29,19 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E ID = rand(1,999) name = "[name] [ID]" -/obj/machinery/computer/telecrystals/uplinker/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/telecrystals/uplinker/attackby(obj/item/I, mob/user, params) if(uplinkholder) to_chat(user, "The [src] already has an uplink in it.") return - if(O.hidden_uplink) - var/obj/item/I = user.get_active_held_item() - if(!user.drop_item()) + if(I.hidden_uplink) + if(!user.transferItemToLoc(I, src)) return uplinkholder = I - I.loc = src I.add_fingerprint(user) update_icon() updateUsrDialog() else - to_chat(user, "The [O] doesn't appear to be an uplink...") + to_chat(user, "[I] doesn't appear to be an uplink...") /obj/machinery/computer/telecrystals/uplinker/update_icon() ..() diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 04c2ad6e29..bca494e8e0 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -15,6 +15,7 @@ /obj/structure/frame/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) +<<<<<<< HEAD new /obj/item/stack/sheet/metal(loc, 5) if(circuit) circuit.forceMove(loc) @@ -253,6 +254,244 @@ /obj/structure/frame/machine/deconstruct(disassembled = TRUE) +======= + new /obj/item/stack/sheet/metal(loc, 5) + if(circuit) + circuit.forceMove(loc) + circuit = null + qdel(src) + + +/obj/structure/frame/machine + name = "machine frame" + var/list/components = null + var/list/req_components = null + var/list/req_component_names = null // user-friendly names of components + +/obj/structure/frame/machine/examine(user) + ..() + if(state == 3 && req_components && req_component_names) + var/hasContent = 0 + var/requires = "It requires" + + for(var/i = 1 to req_components.len) + var/tname = req_components[i] + var/amt = req_components[tname] + if(amt == 0) + continue + var/use_and = i == req_components.len + requires += "[(hasContent ? (use_and ? ", and" : ",") : "")] [amt] [amt == 1 ? req_component_names[tname] : "[req_component_names[tname]]\s"]" + hasContent = 1 + + if(hasContent) + to_chat(user, requires + ".") + else + to_chat(user, "It does not require any more components.") + +/obj/structure/frame/machine/proc/update_namelist() + if(!req_components) + return + + req_component_names = new() + for(var/tname in req_components) + if(ispath(tname, /obj/item/stack)) + var/obj/item/stack/S = tname + var/singular_name = initial(S.singular_name) + if(singular_name) + req_component_names[tname] = singular_name + else + req_component_names[tname] = initial(S.name) + else + var/obj/O = tname + req_component_names[tname] = initial(O.name) + +/obj/structure/frame/machine/proc/get_req_components_amt() + var/amt = 0 + for(var/path in req_components) + amt += req_components[path] + return amt + +/obj/structure/frame/machine/attackby(obj/item/P, mob/user, params) + switch(state) + if(1) + if(istype(P, /obj/item/circuitboard/machine)) + to_chat(user, "The frame needs wiring first!") + return + else if(istype(P, /obj/item/circuitboard)) + to_chat(user, "This frame does not accept circuit boards of this type!") + return + if(istype(P, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = P + if(C.get_amount() >= 5) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You start to add cables to the frame...") + if(do_after(user, 20*P.toolspeed, target = src)) + if(C.get_amount() >= 5 && state == 1) + C.use(5) + to_chat(user, "You add cables to the frame.") + state = 2 + icon_state = "box_1" + else + to_chat(user, "You need five length of cable to wire the frame!") + return + if(istype(P, /obj/item/screwdriver) && !anchored) + playsound(src.loc, P.usesound, 50, 1) + user.visible_message("[user] disassembles the frame.", \ + "You start to disassemble the frame...", "You hear banging and clanking.") + if(do_after(user, 40*P.toolspeed, target = src)) + if(state == 1) + to_chat(user, "You disassemble the frame.") + var/obj/item/stack/sheet/metal/M = new (loc, 5) + M.add_fingerprint(user) + qdel(src) + return + if(istype(P, /obj/item/wrench)) + to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") + playsound(src.loc, P.usesound, 75, 1) + if(do_after(user, 40*P.toolspeed, target = src)) + if(state == 1) + to_chat(user, "You [anchored ? "un" : ""]secure [name].") + anchored = !anchored + return + + if(2) + if(istype(P, /obj/item/wrench)) + to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") + playsound(src.loc, P.usesound, 75, 1) + if(do_after(user, 40*P.toolspeed, target = src)) + to_chat(user, "You [anchored ? "un" : ""]secure [name].") + anchored = !anchored + return + + if(istype(P, /obj/item/circuitboard/machine)) + if(!anchored) + to_chat(user, "The frame needs to be secured first!") + return + var/obj/item/circuitboard/machine/B = P + if(!user.transferItemToLoc(B, src)) + return + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You add the circuit board to the frame.") + circuit = B + icon_state = "box_2" + state = 3 + components = list() + req_components = B.req_components.Copy() + update_namelist() + return + + else if(istype(P, /obj/item/circuitboard)) + to_chat(user, "This frame does not accept circuit boards of this type!") + return + + if(istype(P, /obj/item/wirecutters)) + playsound(src.loc, P.usesound, 50, 1) + to_chat(user, "You remove the cables.") + state = 1 + icon_state = "box_0" + var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) + A.amount = 5 + return + + if(3) + if(istype(P, /obj/item/crowbar)) + playsound(src.loc, P.usesound, 50, 1) + state = 2 + circuit.loc = src.loc + components.Remove(circuit) + circuit = null + if(components.len == 0) + to_chat(user, "You remove the circuit board.") + else + to_chat(user, "You remove the circuit board and other components.") + for(var/atom/movable/A in components) + A.loc = src.loc + desc = initial(desc) + req_components = null + components = null + icon_state = "box_1" + return + + if(istype(P, /obj/item/screwdriver)) + var/component_check = 1 + for(var/R in req_components) + if(req_components[R] > 0) + component_check = 0 + break + if(component_check) + playsound(src.loc, P.usesound, 50, 1) + var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1) + new_machine.on_construction() + for(var/obj/O in new_machine.component_parts) + qdel(O) + new_machine.component_parts = list() + for(var/obj/O in src) + O.loc = null + new_machine.component_parts += O + circuit.loc = null + new_machine.RefreshParts() + qdel(src) + return + + if(istype(P, /obj/item/storage/part_replacer) && P.contents.len && get_req_components_amt()) + var/obj/item/storage/part_replacer/replacer = P + var/list/added_components = list() + var/list/part_list = list() + + //Assemble a list of current parts, then sort them by their rating! + for(var/obj/item/stock_parts/co in replacer) + part_list += co + //Sort the parts. This ensures that higher tier items are applied first. + part_list = sortTim(part_list, /proc/cmp_rped_sort) + + for(var/path in req_components) + while(req_components[path] > 0 && (locate(path) in part_list)) + var/obj/item/part = (locate(path) in part_list) + added_components[part] = path + replacer.remove_from_storage(part, src) + req_components[path]-- + part_list -= part + + for(var/obj/item/stock_parts/part in added_components) + components += part + to_chat(user, "[part.name] applied.") + if(added_components.len) + replacer.play_rped_sound() + return + + if(isitem(P) && get_req_components_amt()) + for(var/I in req_components) + if(istype(P, I) && (req_components[I] > 0)) + if(istype(P, /obj/item/stack)) + var/obj/item/stack/S = P + var/used_amt = min(round(S.get_amount()), req_components[I]) + + if(used_amt && S.use(used_amt)) + var/obj/item/stack/NS = locate(S.merge_type) in components + + if(!NS) + NS = new S.merge_type(src, used_amt) + components += NS + else + NS.add(used_amt) + + req_components[I] -= used_amt + to_chat(user, "You add [P] to [src].") + return + if(!user.transferItemToLoc(P, src)) + break + to_chat(user, "You add [P] to [src].") + components += P + req_components[I]-- + return 1 + to_chat(user, "You cannot add that to the machine!") + return 0 + if(user.a_intent == INTENT_HARM) + return ..() + + +/obj/structure/frame/machine/deconstruct(disassembled = TRUE) +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) if(!(flags_1 & NODECONSTRUCT_1)) if(state >= 2) new /obj/item/stack/cable_coil(loc , 5) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e7fa7447b5..e00f1c9b9e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1170,10 +1170,9 @@ to_chat(user, "The maintenance panel is destroyed!") return to_chat(user, "You apply [C]. Next time someone opens the door, it will explode.") - user.drop_item() panel_open = FALSE update_icon() - C.forceMove(src) + user.transferItemToLoc(C, src, TRUE) charge = C else if(istype(C, /obj/item/paper) || istype(C, /obj/item/photo)) if(note) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 95adf12875..542989fa15 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -426,7 +426,6 @@ return if(constructionStep != CONSTRUCTION_NOCIRCUIT) return - user.drop_item() qdel(C) user.visible_message("[user] adds a circuit to [src].", \ "You insert and secure [C].") diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index f8186a8a51..9bf40542a7 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -63,10 +63,9 @@ else if (istype(W, /obj/item/device/assembly/flash/handheld)) if (!bulb) - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return user.visible_message("[user] installs [W] into [src].", "You install [W] into [src].") - W.forceMove(src) bulb = W power_change() else diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index ffa903c3e9..571899d860 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -33,9 +33,8 @@ /obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/card/id/prisoner)) if(!inserted_id) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.forceMove(src) inserted_id = I to_chat(user, "You insert [I].") return @@ -82,18 +81,13 @@ switch(action) if("handle_id") if(inserted_id) - if(!usr.get_active_held_item()) - usr.put_in_hands(inserted_id) - inserted_id = null - else - inserted_id.forceMove(get_turf(src)) - inserted_id = null + usr.put_in_hands(inserted_id) + inserted_id = null else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/card/id/prisoner)) - if(!usr.drop_item()) + var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner) + if(I) + if(!usr.transferItemToLoc(I, src)) return - I.forceMove(src) inserted_id = I if("release_items") var/mob/M = locate(params["mobref"]) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index c5c0200493..23048caf67 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -95,10 +95,8 @@ if(beaker) to_chat(user, "There is already a reagent container loaded!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - - W.forceMove(src) beaker = W to_chat(user, "You attach [W] to [src].") update_icon() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 204ae83c9d..863eb3286b 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -786,11 +786,9 @@ GLOBAL_LIST_EMPTY(allCasters) else qdel(photo) photo = null - if(istype(user.get_active_held_item(), /obj/item/photo)) - photo = user.get_active_held_item() - if(!user.drop_item()) - return - photo.loc = src + photo = user.is_holding_item_of_type(/obj/item/photo) + if(photo && !user.transferItemToLoc(photo, src)) + photo = null if(issilicon(user)) var/list/nametemp = list() var/find diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index cedb94b7b3..26559c5ef9 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -71,8 +71,6 @@ add_fingerprint(user) if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) to_chat(usr, "You put [W] back into [src].") - if(!user.drop_item()) - return qdel(W) return else if (istype(W, /obj/item/wrench)) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 7eace08636..ab16ee67ed 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -84,9 +84,8 @@ if(PTURRET_INTERNAL_ARMOUR_ON) if(istype(I, /obj/item/gun/energy)) //the gun installation part var/obj/item/gun/energy/E = I - if(!user.drop_item()) + if(!user.transferItemToLoc(E, src)) return - E.forceMove(src) installed_gun = E to_chat(user, "You add [I] to the turret.") build_step = PTURRET_GUN_EQUIPPED @@ -101,7 +100,7 @@ if(PTURRET_GUN_EQUIPPED) if(isprox(I)) build_step = PTURRET_SENSORS_ON - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(I)) return to_chat(user, "You add the proximity sensor to the turret.") qdel(I) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 4a72fa90c6..d373e1267a 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -50,9 +50,8 @@ to_chat(user, "Your gun has no external power connector.") return 1 - if(!user.drop_item()) + if(!user.transferItemToLoc(G, src)) return 1 - G.loc = src charging = G use_power = ACTIVE_POWER_USE update_icon(scan = TRUE) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 957f533a29..a9162b85f8 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -83,16 +83,15 @@ if(istype(I, /obj/item/coin)) var/obj/item/coin/C = I if(prob(2)) - if(!user.drop_item()) + if(!user.transferItemToLoc(C, drop_location())) return - C.loc = loc C.throw_at(user, 3, 10) if(prob(10)) balance = max(balance - SPIN_PRICE, 0) to_chat(user, "[src] spits your coin back out!") else - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(C)) return to_chat(user, "You insert a [C.cmineral] coin into [src]'s slot!") balance += C.value diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 886798156e..b45b393ab2 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -140,18 +140,13 @@ if(cell) to_chat(user, "There is already a power cell inside!") return - else - // insert cell - var/obj/item/stock_parts/cell/C = usr.get_active_held_item() - if(istype(C)) - if(!user.drop_item()) - return - cell = C - C.loc = src - C.add_fingerprint(usr) + else if(!user.transferItemToLoc(I, src)) + return + cell = I + I.add_fingerprint(usr) - user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") - SStgui.update_uis(src) + user.visible_message("\The [user] inserts a power cell into \the [src].", "You insert the power cell into \the [src].") + SStgui.update_uis(src) else to_chat(user, "The hatch must be open to insert a power cell!") return diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 7c51c383fa..0854e63e5b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -298,32 +298,31 @@ if(suit) to_chat(user, "The unit already contains a suit!.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return suit = I else if(istype(I, /obj/item/clothing/head/helmet)) if(helmet) to_chat(user, "The unit already contains a helmet!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return helmet = I else if(istype(I, /obj/item/clothing/mask)) if(mask) to_chat(user, "The unit already contains a mask!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return mask = I else if(storage) to_chat(user, "The auxiliary storage compartment is full!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return storage = I - I.loc = src visible_message("[user] inserts [I] into [src]", "You load [I] into [src].") update_icon() return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index efb872b766..d279f2849f 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -150,11 +150,10 @@ to_chat(user, "The cover is screwed on, it won't pry off!") else if(istype(I, /obj/item/bombcore)) if(!payload) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return payload = I to_chat(user, "You place [payload] into [src].") - payload.loc = src else to_chat(user, "[payload] is already loaded into [src]! You'll have to remove it first.") else if(istype(I, /obj/item/weldingtool)) @@ -463,11 +462,10 @@ return else if(istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/glass/bottle)) if(beakers.len < max_beakers) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return beakers += I to_chat(user, "You load [src] with [I].") - I.loc = src else to_chat(user, "The [I] wont fit! The [src] can only hold up to [max_beakers] containers.") return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d4a06d0580..bf08e98992 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -189,9 +189,8 @@ var/obj/item/reagent_containers/food/snacks/S = W if(!S.junkiness) if(!iscompartmentfull(user)) - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - W.loc = src food_load(W) to_chat(user, "You insert [W] into [src]'s chef compartment.") else @@ -279,9 +278,8 @@ if(!premium.len) to_chat(user, "[src] doesn't have a coin slot.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - W.loc = src coin = W to_chat(user, "You insert [W] into [src].") return diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 7091bfd72a..a75294c28f 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -161,7 +161,7 @@ var/obj/item/mecha_parts/mecha_equipment/E = W spawn() if(E.can_attach(src)) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(W)) return E.attach(src) user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") @@ -226,11 +226,10 @@ else if(istype(W, /obj/item/stock_parts/cell)) if(state==4) if(!cell) - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return var/obj/item/stock_parts/cell/C = W to_chat(user, "You install the powercell.") - C.forceMove(src) cell = C log_message("Powercell installed") else diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 3f32b18178..41ba67d616 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -128,7 +128,7 @@ /obj/effect/particle_effect/smoke/bad/smoke_mob(mob/living/carbon/M) if(..()) - M.drop_item() + M.drop_all_held_items() M.adjustOxyLoss(1) M.emote("cough") return 1 @@ -205,7 +205,6 @@ /obj/effect/particle_effect/smoke/sleeping/smoke_mob(mob/living/carbon/M) if(..()) - M.drop_item() M.Sleeping(200) M.emote("cough") return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 362148c801..76e1468751 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -531,7 +531,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) to_chat(M, "You become nearsighted!") if(prob(50)) if(M.stat != DEAD) - if(M.drop_item()) + if(M.drop_all_held_items()) to_chat(M, "You drop what you're holding and clutch at your eyes!") M.adjust_blurriness(10) M.Unconscious(20) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 50b0f4e7e6..e7dfc96ab5 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/restraints breakouttime = 600 @@ -369,4 +370,378 @@ var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) B.Crossed(hit_atom) qdel(src) - ..() \ No newline at end of file + ..() +======= +/obj/item/restraints + breakouttime = 600 + +//Handcuffs + +/obj/item/restraints/handcuffs + name = "handcuffs" + desc = "Use this to keep prisoners in line." + gender = PLURAL + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "handcuff" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + throwforce = 0 + w_class = WEIGHT_CLASS_SMALL + throw_speed = 3 + throw_range = 5 + materials = list(MAT_METAL=500) + origin_tech = "engineering=3;combat=3" + breakouttime = 600 //Deciseconds = 60s = 1 minute + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50) + var/cuffsound = 'sound/weapons/handcuffs.ogg' + var/trashtype = null //for disposable cuffs + +/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/carbon/human/user) + if(!istype(C)) + return + if(user.disabilities & CLUMSY && prob(50)) + to_chat(user, "Uh... how do those things work?!") + apply_cuffs(user,user) + return + + // chance of monkey retaliation + if(ismonkey(C) && prob(MONKEY_CUFF_RETALIATION_PROB)) + var/mob/living/carbon/monkey/M + M = C + M.retaliate(user) + + if(!C.handcuffed) + if(C.get_num_arms() >= 2 || C.get_arm_ignore()) + C.visible_message("[user] is trying to put [src.name] on [C]!", \ + "[user] is trying to put [src.name] on [C]!") + + playsound(loc, cuffsound, 30, 1, -2) + if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore())) + apply_cuffs(C,user) + to_chat(user, "You handcuff [C].") + SSblackbox.add_details("handcuffs","[type]") + + add_logs(user, C, "handcuffed") + else + to_chat(user, "You fail to handcuff [C]!") + else + to_chat(user, "[C] doesn't have two hands...") + +/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0) + if(target.handcuffed) + return + + if(!user.temporarilyRemoveItemFromInventory(src) && !dispense) + return + + var/obj/item/restraints/handcuffs/cuffs = src + if(trashtype) + cuffs = new trashtype() + else if(dispense) + cuffs = new type() + + cuffs.forceMove(target) + target.handcuffed = cuffs + + target.update_handcuffed() + if(trashtype && !dispense) + qdel(src) + return + +/obj/item/restraints/handcuffs/sinew + name = "sinew restraints" + desc = "A pair of restraints fashioned from long strands of flesh." + icon = 'icons/obj/mining.dmi' + icon_state = "sinewcuff" + item_state = "sinewcuff" + breakouttime = 300 //Deciseconds = 30s + cuffsound = 'sound/weapons/cablecuff.ogg' + +/obj/item/restraints/handcuffs/cable + name = "cable restraints" + desc = "Looks like some cables tied together. Could be used to tie something up." + icon_state = "cuff_red" + item_state = "coil_red" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + materials = list(MAT_METAL=150, MAT_GLASS=75) + origin_tech = "engineering=2" + breakouttime = 300 //Deciseconds = 30s + cuffsound = 'sound/weapons/cablecuff.ogg' + var/datum/robot_energy_storage/wirestorage = null + +/obj/item/restraints/handcuffs/cable/attack(mob/living/carbon/C, mob/living/carbon/human/user) + if(!istype(C)) + return + if(wirestorage && wirestorage.energy < 15) + to_chat(user, "You need at least 15 wire to restrain [C]!") + return + return ..() + +/obj/item/restraints/handcuffs/cable/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0) + if(wirestorage) + if(!wirestorage.use_charge(15)) + to_chat(user, "You need at least 15 wire to restrain [target]!") + return + return ..(target, user, 1) + + return ..() + +/obj/item/restraints/handcuffs/cable/red + icon_state = "cuff_red" + item_state = "coil_red" + +/obj/item/restraints/handcuffs/cable/yellow + icon_state = "cuff_yellow" + item_state = "coil_yellow" + +/obj/item/restraints/handcuffs/cable/blue + icon_state = "cuff_blue" + item_state = "coil_blue" + +/obj/item/restraints/handcuffs/cable/green + icon_state = "cuff_green" + item_state = "coil_green" + +/obj/item/restraints/handcuffs/cable/pink + icon_state = "cuff_pink" + item_state = "coil_pink" + +/obj/item/restraints/handcuffs/cable/orange + icon_state = "cuff_orange" + item_state = "coil_orange" + +/obj/item/restraints/handcuffs/cable/cyan + icon_state = "cuff_cyan" + item_state = "coil_cyan" + +/obj/item/restraints/handcuffs/cable/white + icon_state = "cuff_white" + item_state = "coil_white" + +/obj/item/restraints/handcuffs/alien + icon_state = "handcuffAlien" + +/obj/item/restraints/handcuffs/fake + name = "fake handcuffs" + desc = "Fake handcuffs meant for gag purposes." + breakouttime = 10 //Deciseconds = 1s + +/obj/item/restraints/handcuffs/fake/kinky + name = "kinky handcuffs" + desc = "Fake handcuffs meant for erotic roleplay." + icon_state = "handcuffGag" + +/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = I + if (R.use(1)) + var/obj/item/wirerod/W = new /obj/item/wirerod + remove_item_from_storage(user) + user.put_in_hands(W) + to_chat(user, "You wrap the cable restraint around the top of the rod.") + qdel(src) + else + to_chat(user, "You need one rod to make a wired rod!") + return + else if(istype(I, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = I + if(M.get_amount() < 6) + to_chat(user, "You need at least six metal sheets to make good enough weights!") + return + to_chat(user, "You begin to apply [I] to [src]...") + if(do_after(user, 35, target = src)) + if(M.get_amount() < 6 || !M) + return + var/obj/item/restraints/legcuffs/bola/S = new /obj/item/restraints/legcuffs/bola + M.use(6) + user.put_in_hands(S) + to_chat(user, "You make some weights out of [I] and tie them to [src].") + remove_item_from_storage(user) + qdel(src) + else + return ..() + +/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) + if(iscyborg(user)) + if(!C.handcuffed) + playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) + C.visible_message("[user] is trying to put zipties on [C]!", \ + "[user] is trying to put zipties on [C]!") + if(do_mob(user, C, 30)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) + C.update_handcuffed() + to_chat(user, "You handcuff [C].") + add_logs(user, C, "handcuffed") + else + to_chat(user, "You fail to handcuff [C]!") + +/obj/item/restraints/handcuffs/cable/zipties + name = "zipties" + desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." + icon_state = "cuff_white" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + materials = list() + breakouttime = 450 //Deciseconds = 45s + trashtype = /obj/item/restraints/handcuffs/cable/zipties/used + +/obj/item/restraints/handcuffs/cable/zipties/used + desc = "A pair of broken zipties." + icon_state = "cuff_white_used" + item_state = "cuff_white" + +/obj/item/restraints/handcuffs/cable/zipties/used/attack() + return + + +//Legcuffs + +/obj/item/restraints/legcuffs + name = "leg cuffs" + desc = "Use this to keep prisoners in line." + gender = PLURAL + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "handcuff" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + flags_1 = CONDUCT_1 + throwforce = 0 + w_class = WEIGHT_CLASS_NORMAL + origin_tech = "engineering=3;combat=3" + slowdown = 7 + breakouttime = 300 //Deciseconds = 30s = 0.5 minute + +/obj/item/restraints/legcuffs/beartrap + name = "bear trap" + throw_speed = 1 + throw_range = 1 + icon_state = "beartrap" + desc = "A trap used to catch bears and other legged creatures." + origin_tech = "engineering=4" + var/armed = 0 + var/trap_damage = 20 + +/obj/item/restraints/legcuffs/beartrap/Initialize() + . = ..() + icon_state = "[initial(icon_state)][armed]" + +/obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user) + user.visible_message("[user] is sticking [user.p_their()] head in the [src.name]! It looks like [user.p_theyre()] trying to commit suicide!") + playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) + return (BRUTELOSS) + +/obj/item/restraints/legcuffs/beartrap/attack_self(mob/user) + ..() + if(ishuman(user) && !user.stat && !user.restrained()) + armed = !armed + icon_state = "[initial(icon_state)][armed]" + to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") + +/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj) + if(armed && isturf(src.loc)) + if(isliving(AM)) + var/mob/living/L = AM + var/snap = 0 + var/def_zone = "chest" + if(iscarbon(L)) + var/mob/living/carbon/C = L + snap = 1 + if(!C.lying) + def_zone = pick("l_leg", "r_leg") + if(!C.legcuffed && C.get_num_legs() >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs. + C.legcuffed = src + src.loc = C + C.update_inv_legcuffed() + SSblackbox.add_details("handcuffs","[type]") + else if(isanimal(L)) + var/mob/living/simple_animal/SA = L + if(SA.mob_size > MOB_SIZE_TINY) + snap = 1 + if(L.movement_type & FLYING) + snap = 0 + if(snap) + armed = 0 + icon_state = "[initial(icon_state)][armed]" + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + L.visible_message("[L] triggers \the [src].", \ + "You trigger \the [src]!") + L.apply_damage(trap_damage,BRUTE, def_zone) + ..() + +/obj/item/restraints/legcuffs/beartrap/energy + name = "energy snare" + armed = 1 + icon_state = "e_snare" + trap_damage = 0 + flags_1 = DROPDEL_1 + +/obj/item/restraints/legcuffs/beartrap/energy/New() + ..() + addtimer(CALLBACK(src, .proc/dissipate), 100) + +/obj/item/restraints/legcuffs/beartrap/energy/proc/dissipate() + if(!ismob(loc)) + do_sparks(1, TRUE, src) + qdel(src) + +/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user) + Crossed(user) //honk + +/obj/item/restraints/legcuffs/beartrap/energy/cyborg + breakouttime = 20 // Cyborgs shouldn't have a strong restraint + +/obj/item/restraints/legcuffs/bola + name = "bola" + desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly." + icon_state = "bola" + breakouttime = 35//easy to apply, easy to break out of + gender = NEUTER + origin_tech = "engineering=3;combat=1" + var/knockdown = 0 + +/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) + if(!..()) + return + playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1) + +/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom) + if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, + return//abort + var/mob/living/carbon/C = hit_atom + if(!C.legcuffed && C.get_num_legs() >= 2) + visible_message("\The [src] ensnares [C]!") + C.legcuffed = src + src.loc = C + C.update_inv_legcuffed() + SSblackbox.add_details("handcuffs","[type]") + to_chat(C, "\The [src] ensnares you!") + C.Knockdown(knockdown) + +/obj/item/restraints/legcuffs/bola/tactical//traitor variant + name = "reinforced bola" + desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody." + icon_state = "bola_r" + breakouttime = 70 + origin_tech = "engineering=4;combat=3" + knockdown = 20 + +/obj/item/restraints/legcuffs/bola/energy //For Security + name = "energy bola" + desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." + icon_state = "ebola" + hitsound = 'sound/weapons/taserhit.ogg' + w_class = WEIGHT_CLASS_SMALL + breakouttime = 60 + +/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom) + if(iscarbon(hit_atom)) + var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom)) + B.Crossed(hit_atom) + qdel(src) + ..() +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index d727c517bd..cff958926d 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -233,7 +233,7 @@ /obj/item/melee/supermatter_sword/afterattack(target, mob/user, proximity_flag) if(user && target == user) - user.drop_item() + user.dropItemToGround(src) if(proximity_flag) consume_everything(target) ..() @@ -243,7 +243,7 @@ if(ismob(target)) var/mob/M if(src.loc == M) - M.drop_item() + M.dropItemToGround(src) consume_everything(target) /obj/item/melee/supermatter_sword/pickup(user) @@ -267,7 +267,7 @@ /obj/item/melee/supermatter_sword/suicide_act(mob/user) user.visible_message("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!") - user.drop_item() + user.dropItemToGround(src, TRUE) shard.CollidedWith(user) /obj/item/melee/supermatter_sword/proc/consume_everything(target) diff --git a/code/game/objects/items/paiwire.dm b/code/game/objects/items/paiwire.dm index e0900ba50d..6b6b3101c6 100644 --- a/code/game/objects/items/paiwire.dm +++ b/code/game/objects/items/paiwire.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/pai_cable desc = "A flexible coated cable with a universal jack on one end." name = "data cable" @@ -11,4 +12,18 @@ return user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") src.loc = M +======= +/obj/item/pai_cable + desc = "A flexible coated cable with a universal jack on one end." + name = "data cable" + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + flags_1 = NOBLUDGEON_1 + var/obj/machinery/machine + +/obj/item/pai_cable/proc/plugin(obj/machinery/M, mob/living/user) + if(!user.transferItemToLoc(src, M)) + return + user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) machine = M \ No newline at end of file diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 6cb26b3144..9400303b84 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -122,7 +122,7 @@ return if(user.disabilities & CLUMSY && prob(75) && clumsyCheck) user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") - user.drop_item() + user.dropItemToGround(src, TRUE) if(prob(10)) target = get_turf(user) else diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 3d7b4a9603..f47c5d30eb 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -254,7 +254,7 @@ if(!isturf(loc)) to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!") return - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(M)) to_chat(user, "[M] is stuck to your hand!") return qdel(M) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 3e9231f562..2428524383 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -48,7 +48,7 @@ /obj/item/storage/backpack/holding/suicide_act(mob/living/user) user.visible_message("[user] is jumping into [src]! It looks like [user.p_theyre()] trying to commit suicide.") - user.drop_item() + user.dropItemToGround(src, TRUE) user.Stun(100, ignore_canstun = TRUE) sleep(20) playsound(src, "rustle", 50, 1, -5) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 489f1c6bf0..313988b7d4 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -57,11 +57,9 @@ close_all() to_chat(user, "You fold [src] flat.") - var/obj/item/I = new foldable(get_turf(src)) - user.drop_item() - user.put_in_hands(I) - user.update_inv_hands() + var/obj/item/I = new foldable qdel(src) + user.put_in_hands(I) /obj/item/storage/box/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/packageWrap)) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a683902a6c..85f5de7526 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1022,8 +1022,8 @@ throwforce = 12 //pelt your enemies to death with lumps of snow /obj/item/toy/snowball/afterattack(atom/target as mob|obj|turf|area, mob/user) - user.drop_item() - src.throw_at(target, throw_range, throw_speed) + if(user.dropItemToGround(src)) + throw_at(target, throw_range, throw_speed) /obj/item/toy/snowball/throw_impact(atom/hit_atom) if(!..()) @@ -1041,8 +1041,8 @@ w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets /obj/item/toy/beach_ball/afterattack(atom/target as mob|obj|turf|area, mob/user) - user.drop_item() - src.throw_at(target, throw_range, throw_speed) + if(user.dropItemToGround(src)) + throw_at(target, throw_range, throw_speed) /* * Xenomorph action figure diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index b1103ac1da..5504c1a8fc 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -20,6 +20,7 @@ /obj/structure/Destroy() GLOB.cameranet.updateVisibility(src) +<<<<<<< HEAD if(smooth) queue_smooth_neighbors(src) return ..() @@ -61,6 +62,49 @@ /obj/structure/proc/do_climb(atom/movable/A) if(climbable) +======= + if(smooth) + queue_smooth_neighbors(src) + return ..() + +/obj/structure/attack_hand(mob/user) + . = ..() + add_fingerprint(user) + if(structureclimber && structureclimber != user) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + structureclimber.Knockdown(40) + structureclimber.visible_message("[structureclimber.name] has been knocked off the [src]", "You're knocked off the [src]!", "You see [structureclimber.name] get knocked off the [src]") + interact(user) + +/obj/structure/interact(mob/user) + ui_interact(user) + +/obj/structure/ui_act(action, params) + ..() + add_fingerprint(usr) + +/obj/structure/MouseDrop_T(atom/movable/O, mob/user) + . = ..() + if(!climbable) + return + if(user == O && iscarbon(O)) + if(user.canmove) + climb_structure(user) + return + if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O)) + return + if(iscyborg(user)) + return + if(!user.drop_all_held_items()) + return + if (O.loc != src.loc) + step(O, get_dir(O, src)) + return + +/obj/structure/proc/do_climb(atom/movable/A) + if(climbable) +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) density = FALSE . = step(A,get_dir(A,src.loc)) density = TRUE diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 9d6985c620..606b10da0a 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -58,14 +58,14 @@ playsound(src.loc, W.usesound, 50, 1) deconstruct() else if(istype(W, /obj/item/assembly/shock_kit)) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(W)) return var/obj/item/assembly/shock_kit/SK = W var/obj/structure/chair/e_chair/E = new /obj/structure/chair/e_chair(src.loc) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) E.setDir(dir) E.part = SK - SK.loc = E + SK.forceMove(E) SK.master = E qdel(src) else diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 68de701967..f6e2023943 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -27,7 +27,8 @@ LINEN BINS ..() /obj/item/bedsheet/attack_self(mob/user) - user.drop_item() + if(!user.dropItemToGround(src)) + return if(layer == initial(layer)) layer = ABOVE_MOB_LAYER to_chat(user, "You cover yourself with [src].") @@ -275,18 +276,16 @@ LINEN BINS /obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/bedsheet)) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.loc = src sheets.Add(I) amount++ to_chat(user, "You put [I] in [src].") update_icon() else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) to_chat(user, "\The [I] is stuck to your hand, you cannot hide it among the sheets!") return - I.loc = src hidden = I to_chat(user, "You hide [I] among the sheets.") diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 3d77be1bb5..4e3056f39a 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -229,8 +229,7 @@ "You cut \the [src] apart with \the [W].") deconstruct(TRUE) return 0 - if(user.drop_item()) // so we put in unlit welder too - W.forceMove(loc) + if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too return 1 else if(istype(W, /obj/item/weldingtool) && can_weld_shut) var/obj/item/weldingtool/WT = W diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index a5173a5f80..448b358c1a 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -602,10 +602,9 @@ if(do_after(user, 40, target = src)) if( src.state != 1 ) return - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - W.loc = src to_chat(user, "You install the airlock electronics.") src.state = 2 src.name = "near finished airlock assembly" diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index e61e1a1870..0a3574b1a6 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -54,9 +54,8 @@ return if(istype(I, /obj/item/extinguisher)) if(!stored_extinguisher && opened) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - contents += I stored_extinguisher = I to_chat(user, "You place [I] in [src].") update_icon() diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 803c4d4627..afcd855caf 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -53,10 +53,9 @@ if(F.wielded) to_chat(user, "Unwield the [F.name] first.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(F, src)) return fireaxe = F - F.forceMove(src) to_chat(user, "You place the [F.name] back in the [name].") update_icon() return diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 3d7e9be21a..b3b6022834 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -259,9 +259,8 @@ else if(istype(W, /obj/item/pipe)) var/obj/item/pipe/P = W if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. - if(!user.drop_item()) + if(!user.transferItemToLoc(P, drop_location())) return - P.loc = src.loc to_chat(user, "You fit the pipe into \the [src].") else return ..() diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 24a6bd4ceb..ac6a69ed93 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -39,9 +39,8 @@ return if(istype(I, gun_category) && open) if(LAZYLEN(contents) < capacity) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.forceMove(src) to_chat(user, "You place [I] in [src].") update_icon() else diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 58db777abe..747e0b3317 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -32,9 +32,8 @@ return 1 /obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.loc = src updateUsrDialog() to_chat(user, "You put [I] into [src].") return diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index dc4ffe37b6..0ba290ac31 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -159,10 +159,9 @@ FLOOR SAFES . = 1 //no afterattack if(I.w_class + space <= maxspace) space += I.w_class - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") return - I.forceMove(src) to_chat(user, "You put [I] in [src].") updateUsrDialog() return diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index afa74cbb5e..fb46dd45de 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -104,7 +104,6 @@ "You attach the sign to [T].") playsound(T, 'sound/items/deconstruct.ogg', 50, 1) new sign_path(T) - user.drop_item() qdel(src) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index c54661066a..a3dfe2b669 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -131,8 +131,7 @@ // If the tray IS empty, continue on (tray will be placed on the table like other items) if(user.a_intent != INTENT_HARM && !(I.flags_1 & ABSTRACT_1)) - if(user.drop_item()) - I.Move(loc) + if(user.transferItemToLoc(I, drop_location())) var/list/click_params = params2list(params) //Center the icon where the user clicked. if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) @@ -439,7 +438,7 @@ /obj/structure/rack/MouseDrop_T(obj/O, mob/user) if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O)) return - if(!user.drop_item()) + if(!user.dropItemToGround(O)) return if(O.loc != src.loc) step(O, get_dir(O, src)) @@ -452,8 +451,7 @@ return if(user.a_intent == INTENT_HARM) return ..() - if(user.drop_item()) - W.Move(loc) + if(user.transferItemToLoc(W, drop_location())) return 1 /obj/structure/rack/attack_paw(mob/living/user) @@ -516,7 +514,7 @@ building = TRUE to_chat(user, "You start constructing a rack...") if(do_after(user, 50, target = user, progress=TRUE)) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(src)) return var/obj/structure/rack/R = new /obj/structure/rack(user.loc) user.visible_message("[user] assembles \a [R].\ diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 1699010309..076f39b85f 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -62,9 +62,8 @@ to_chat(user, "[src] can't hold any more of [I].") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.loc = src to_chat(user, "You put [I] in [src].") update_icon() diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index dc6d350c91..b70326b893 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -5,6 +5,7 @@ icon_state = "target_stake" density = TRUE flags_1 = CONDUCT_1 +<<<<<<< HEAD var/obj/item/target/pinned_target /obj/structure/target_stake/Destroy() @@ -52,4 +53,52 @@ if(pinned_target) pinned_target.bullet_act(P) else +======= + var/obj/item/target/pinned_target + +/obj/structure/target_stake/Destroy() + if(pinned_target) + pinned_target.nullPinnedLoc() + return ..() + +/obj/structure/target_stake/proc/nullPinnedTarget() + pinned_target = null + +/obj/structure/target_stake/Move() + ..() + if(pinned_target) + pinned_target.loc = loc + +/obj/structure/target_stake/attackby(obj/item/target/T, mob/user) + if(pinned_target) + return + if(istype(T) && user.transferItemToLoc(T, drop_location())) + pinned_target = T + T.pinnedLoc = src + T.density = TRUE + T.layer = OBJ_LAYER + 0.01 + to_chat(user, "You slide the target into the stake.") + +/obj/structure/target_stake/attack_hand(mob/user) + if(pinned_target) + removeTarget(user) + +/obj/structure/target_stake/proc/removeTarget(mob/user) + pinned_target.layer = OBJ_LAYER + pinned_target.loc = user.loc + pinned_target.nullPinnedLoc() + nullPinnedTarget() + if(ishuman(user)) + if(!user.get_active_held_item()) + user.put_in_hands(pinned_target) + to_chat(user, "You take the target out of the stake.") + else + pinned_target.loc = get_turf(user) + to_chat(user, "You take the target out of the stake.") + +/obj/structure/target_stake/bullet_act(obj/item/projectile/P) + if(pinned_target) + pinned_target.bullet_act(P) + else +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) ..() \ No newline at end of file diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index a475bb7069..18d8b8f7f0 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -88,10 +88,9 @@ if(w_items + I.w_class > WEIGHT_CLASS_HUGE) to_chat(user, "The cistern is full!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the cistern!") return - I.loc = src w_items += I.w_class to_chat(user, "You carefully place [I] into the cistern.") @@ -173,10 +172,9 @@ if(I.w_class > 1) to_chat(user, "[I] is too large for the drain enclosure.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) to_chat(user, "\[I] is stuck to your hand, you cannot put it in the drain enclosure!") return - I.forceMove(src) hiddenitem = I to_chat(user, "You place [I] into the drain enclosure.") diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index c4a0d48dde..cb22c2a8c1 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -208,11 +208,10 @@ //Adding airlock electronics for access. Step 6 complete. else if(istype(W, /obj/item/electronics/airlock)) - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return playsound(loc, W.usesound, 100, 1) user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...") - W.loc = src if(do_after(user, 40, target = src)) if(!src || electronics) diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 0dd3673f6a..f0fb7c4448 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -72,7 +72,7 @@ if(..()) return if(istype(C, /obj/item/light/bulb)) //only for light tiles - if(state && user.drop_item()) + if(state && user.temporarilyRemoveItemFromInventory(C)) qdel(C) state = 0 //fixing it by bashing it with a light bulb, fun eh? update_icon() diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 0dcd676213..ebd2214aba 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -89,22 +89,20 @@ var/mob/M = user if(isigniter(S.a_left) == isigniter(S.a_right)) //Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it return - if(!M.drop_item()) //Remove the assembly from your hands + if(!M.temporarilyRemoveItemFromInventory(src)) //Remove the assembly from your hands return - var/obj/item/device/onetankbomb/R = new /obj/item/device/onetankbomb(loc) + var/obj/item/device/onetankbomb/R = new - M.temporarilyRemoveItemFromInventory(src, TRUE) //Remove the tank from your character,in case you were holding it - if(!M.put_in_hands(R)) //Equips the bomb if possible, or puts it on the floor. - forceMove(get_turf(M)) + M.put_in_hands(R) //Equips the bomb if possible, or puts it on the floor. R.bombassembly = S //Tell the bomb about its assembly part S.master = R //Tell the assembly about its new owner - S.loc = R //Move the assembly out of the fucking way + S.forceMove(R) //Move the assembly out of the fucking way R.bombtank = src //Same for tank master = R - loc = R + forceMove(R) R.update_icon() return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index e368fdde92..efc6a8e899 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -276,10 +276,9 @@ if(beaker) to_chat(user, "A beaker is already loaded into [src]!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return beaker = I - I.loc = src user.visible_message("[user] places [I] in [src].", \ "You place [I] in [src].") var/reagentlist = pretty_string_from_reagent_list(I.reagents.reagent_list) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 9a2ecb6fea..96a5b8e489 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -80,9 +80,8 @@ if(istype(W, /obj/item/tank)) if(!(stat & BROKEN)) var/obj/item/tank/T = W - if(holding || !user.drop_item()) + if(holding || !user.transferItemToLoc(T, src)) return - T.loc = src holding = T update_icon() else if(istype(W, /obj/item/wrench)) diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 1bc43cc293..87583ebea1 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -174,7 +174,7 @@ /obj/item/dice/d20/fate/equipped(mob/user, slot) 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.drop_item() + user.dropItemToGround(src) /obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user,roll) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 237714eb8e..ed81aa0fbf 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -592,7 +592,7 @@ BLIND // can't see anything to_chat(user, "[src] already has an accessory.") return else - if(user && !user.drop_item()) + if(user && !user.temporarilyRemoveItemFromInventory(I)) return if(!A.attach(src, user)) return diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 67fd017153..63ff85ac17 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -22,13 +22,10 @@ /obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0) //Creates a shattering noise and replaces the bottle with a broken_bottle - var/new_location = get_turf(loc) + var/new_location = get_turf(src) var/obj/item/broken_bottle/B = new /obj/item/broken_bottle(new_location) - if(ranged) - B.loc = new_location - else - user.drop_item() - user.put_in_active_hand(B) + if(!ranged) + user.put_in_hands(B) B.icon_state = src.icon_state var/icon/I = new('icons/obj/drinks.dmi', src.icon_state) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 0f27265b4b..df323a99ff 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -58,10 +58,9 @@ insert ascii eagle on american flag background here else if(is_type_in_typecache(I, deepfry_blacklisted_items)) . = ..() - else if(user.drop_item() && !frying) + else if(!frying && user.transferItemToLoc(I, src)) to_chat(user, "You put [I] into [src].") frying = I - frying.forceMove(src) icon_state = "fryer_on" /obj/machinery/deepfryer/process() diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index ee29690027..d6037af55b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -68,8 +68,6 @@ if(istype(O, /obj/item/reagent_containers/food/drinks/drinkingglass)) var/obj/item/reagent_containers/food/drinks/drinkingglass/DG = O if(!DG.reagents.total_volume) //glass is empty - if(!user.drop_item()) - return qdel(DG) glasses++ to_chat(user, "The [src] accepts the drinking glass, sterilizing it.") @@ -78,9 +76,8 @@ to_chat(user, "The [src] is at full capacity.") else var/obj/item/reagent_containers/food/snacks/S = O - if(!user.drop_item()) + if(!user.transferItemToLoc(S, src)) return - S.loc = src if(stored_food[sanitize(S.name)]) stored_food[sanitize(S.name)]++ else diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index e25b29f721..fd2471b96e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -142,11 +142,10 @@ to_chat(user, "[src] is full, you can't put anything in!") return 1 else - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]!") return 0 - O.loc = src user.visible_message( \ "[user] has added \the [O] to \the [src].", \ "You add \the [O] to \the [src].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 6e245bd386..fb871f2c3a 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -195,8 +195,7 @@ if(P) user.visible_message("[user] put [O] into [src].", \ "You put [O] into [src].") - user.drop_item() - O.loc = src + user.transferItemToLoc(O, src, TRUE) return 1 else if(user.a_intent != INTENT_HARM) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 82fcc8c538..6788d1fc92 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -178,20 +178,18 @@ if(pizza) to_chat(user, "[src] already has \a [pizza.name]!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return pizza = I - I.loc = src to_chat(user, "You put [I] in [src].") update_icon() return else if(istype(I, /obj/item/bombcore/pizza)) if(open && !bomb) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return wires = new /datum/wires/explosive/pizza(src) bomb = I - I.loc = src to_chat(user, "You put [I] in [src]. Sneeki breeki...") update_icon() return diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 86481b4c14..a735a48ff4 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -104,7 +104,7 @@ /obj/structure/holohoop/attackby(obj/item/W as obj, mob/user as mob, params) if(get_dist(src,user)<2) - if(user.drop_item(src)) + if(user.transferItemToLoc(W, drop_location())) visible_message(" [user] dunks [W] into \the [src]!") /obj/structure/holohoop/attack_hand(mob/user) @@ -211,9 +211,7 @@ /obj/machinery/conveyor/holodeck /obj/machinery/conveyor/holodeck/attackby(obj/item/I, mob/user, params) - if(user.drop_item()) - I.loc = src.loc - else + if(!user.transferItemToLoc(I, drop_location())) return ..() /obj/item/paper/fluff/holodeck/trek_diploma diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 5c9b0dac5e..1535173f8d 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -95,9 +95,8 @@ if(beaker) to_chat(user, "A container is already loaded into the machine.") else - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) return - O.loc = src beaker = O to_chat(user, "You add the container to the machine.") update_icon() diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 9439346bba..de881a0611 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -80,7 +80,7 @@ if(seed) to_chat(user, "A sample is already loaded into the machine!") else - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory()) return insert_seed(I) to_chat(user, "You add [I] to the machine.") @@ -90,10 +90,9 @@ if(disk) to_chat(user, "A data disk is already loaded into the machine!") else - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return disk = I - disk.loc = src to_chat(user, "You add [I] to the machine.") interact(user) else @@ -269,7 +268,7 @@ else var/obj/item/I = usr.get_active_held_item() if (istype(I, /obj/item/seeds)) - if(!usr.drop_item()) + if(!usr.temporarilyRemoveItemFromInventory(I)) return insert_seed(I) to_chat(usr, "You add [I] to the machine.") @@ -283,10 +282,9 @@ else var/obj/item/I = usr.get_active_held_item() if(istype(I, /obj/item/disk/plantgene)) - if(!usr.drop_item()) + if(!usr.transferItemToLoc(I, src)) return disk = I - disk.loc = src to_chat(usr, "You add [I] to the machine.") else if(href_list["op"] == "insert" && disk && disk.gene && seed) if(!operation) // Wait for confirmation diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 5e32701526..7834ed15e8 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -87,8 +87,7 @@ /obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user) user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") playsound(user, 'sound/effects/blobattack.ogg', 50, 1) - var/obj/item/reagent_containers/food/snacks/meat/slab/meatwheat/M = new(get_turf(user)) - user.drop_item() + var/obj/item/reagent_containers/food/snacks/meat/slab/meatwheat/M = new qdel(src) user.put_in_hands(M) return 1 diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index ba56219062..6f54ea5e9b 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -114,4 +114,4 @@ if(prob(20)) M.Unconscious(force / 0.3) M.Knockdown(force / 0.75) - M.drop_item() + M.drop_all_held_items() diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 5d609a9e69..3cc45bf9be 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor, mob/living/user) var/t_amount = 0 if(t_max == -1) @@ -42,6 +43,52 @@ desc = "Extracts and bags seeds from produce." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "sextractor" +======= +/proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor, mob/living/user) + var/t_amount = 0 + if(t_max == -1) + if(extractor) + t_max = rand(1,4) * extractor.seed_multiplier + else + t_max = rand(1,4) + + var/seedloc = O.loc + if(extractor) + seedloc = extractor.loc + + if(istype(O, /obj/item/reagent_containers/food/snacks/grown/)) + var/obj/item/reagent_containers/food/snacks/grown/F = O + if(F.seed) + if(user && !user.temporarilyRemoveItemFromInventory(O)) //couldn't drop the item + return + while(t_amount < t_max) + var/obj/item/seeds/t_prod = F.seed.Copy() + t_prod.loc = seedloc + t_amount++ + qdel(O) + return 1 + + else if(istype(O, /obj/item/grown)) + var/obj/item/grown/F = O + if(F.seed) + if(user && !user.temporarilyRemoveItemFromInventory(O)) + return + while(t_amount < t_max) + var/obj/item/seeds/t_prod = F.seed.Copy() + t_prod.loc = seedloc + t_amount++ + qdel(O) + return 1 + + return 0 + + +/obj/machinery/seed_extractor + name = "seed extractor" + desc = "Extracts and bags seeds from produce." + icon = 'icons/obj/hydroponics/equipment.dmi' + icon_state = "sextractor" +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) density = TRUE anchored = TRUE circuit = /obj/item/circuitboard/machine/seed_extractor @@ -90,6 +137,7 @@ to_chat(user, "You extract some seeds.") return else if (istype(O, /obj/item/seeds)) +<<<<<<< HEAD if(add_seed(O)) to_chat(user, "You add [O] to [src.name].") updateUsrDialog() @@ -196,3 +244,110 @@ piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency) return +======= + if(add_seed(O)) + to_chat(user, "You add [O] to [src.name].") + updateUsrDialog() + return + else if(user.a_intent != INTENT_HARM) + to_chat(user, "You can't extract any seeds from \the [O.name]!") + else + return ..() + +/datum/seed_pile + var/name = "" + var/lifespan = 0 //Saved stats + var/endurance = 0 + var/maturation = 0 + var/production = 0 + var/yield = 0 + var/potency = 0 + var/amount = 0 + +/datum/seed_pile/New(var/name, var/life, var/endur, var/matur, var/prod, var/yie, var/poten, var/am = 1) + src.name = name + src.lifespan = life + src.endurance = endur + src.maturation = matur + src.production = prod + src.yield = yie + src.potency = poten + src.amount = am + +/obj/machinery/seed_extractor/attack_hand(mob/user) + user.set_machine(src) + interact(user) + +/obj/machinery/seed_extractor/interact(mob/user) + if (stat) + return 0 + + var/dat = "Stored seeds:
" + + if (contents.len == 0) + dat += "No seeds" + else + dat += "" + for (var/datum/seed_pile/O in piles) + dat += "" + dat += "" + dat += "
NameLifespanEnduranceMaturationProductionYieldPotencyStock
[O.name][O.lifespan][O.endurance][O.maturation][O.production][O.yield][O.potency]" + dat += "Vend ([O.amount] left)
" + var/datum/browser/popup = new(user, "seed_ext", name, 700, 400) + popup.set_content(dat) + popup.open() + return + +/obj/machinery/seed_extractor/Topic(var/href, var/list/href_list) + if(..()) + return + usr.set_machine(src) + + href_list["li"] = text2num(href_list["li"]) + href_list["en"] = text2num(href_list["en"]) + href_list["ma"] = text2num(href_list["ma"]) + href_list["pr"] = text2num(href_list["pr"]) + href_list["yi"] = text2num(href_list["yi"]) + href_list["pot"] = text2num(href_list["pot"]) + + for (var/datum/seed_pile/N in piles)//Find the pile we need to reduce... + if (href_list["name"] == N.name && href_list["li"] == N.lifespan && href_list["en"] == N.endurance && href_list["ma"] == N.maturation && href_list["pr"] == N.production && href_list["yi"] == N.yield && href_list["pot"] == N.potency) + if(N.amount <= 0) + return + N.amount = max(N.amount - 1, 0) + if (N.amount <= 0) + piles -= N + qdel(N) + break + + for (var/obj/T in contents)//Now we find the seed we need to vend + var/obj/item/seeds/O = T + if (O.plantname == href_list["name"] && O.lifespan == href_list["li"] && O.endurance == href_list["en"] && O.maturation == href_list["ma"] && O.production == href_list["pr"] && O.yield == href_list["yi"] && O.potency == href_list["pot"]) + O.loc = src.loc + break + + src.updateUsrDialog() + return + +/obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/O) + if(contents.len >= 999) + to_chat(usr, "\The [src] is full.") + return 0 + + if(ismob(O.loc)) + var/mob/M = O.loc + if(!M.transferItemToLoc(O, src)) + return 0 + else if(istype(O.loc, /obj/item/storage)) + var/obj/item/storage/S = O.loc + S.remove_from_storage(O,src) + + . = 1 + for (var/datum/seed_pile/N in piles) + if (O.plantname == N.name && O.lifespan == N.lifespan && O.endurance == N.endurance && O.maturation == N.maturation && O.production == N.production && O.yield == N.yield && O.potency == N.potency) + ++N.amount + return + + piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency) + return +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 33f02bc759..711ac4f33a 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -84,9 +84,8 @@ if(2) if(is_type_in_list(I, allowed_books)) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.loc = src update_icon() else if(istype(I, /obj/item/storage/bag/books)) var/obj/item/storage/bag/books/B = I diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index dc48bbae2d..081ecdcdaa 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -507,9 +507,8 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums /obj/machinery/libraryscanner/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/book)) - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) return - O.loc = src else return ..() @@ -576,9 +575,8 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums if(busy) to_chat(user, "The book binder is busy. Please wait for completion of previous operation.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(P, src)) return - P.loc = src user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") audible_message("[src] begins to hum as it warms up its printing drums.") busy = TRUE diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index d419ce7e38..d76278a410 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -67,8 +67,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) B.handle_item_insertion(src) uses_left-- if(uses_left <= 0) - user.drop_item(src) - loc = A + user.transferItemToLoc(src, A, TRUE) var/mutable_appearance/balloon var/mutable_appearance/balloon2 var/mutable_appearance/balloon3 diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 9ada4c768e..2bcccdb164 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -20,6 +20,7 @@ Radio = new/obj/item/device/radio(src) Radio.listening = FALSE locate_stacking_machine() +<<<<<<< HEAD /obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id/prisoner)) @@ -122,6 +123,108 @@ /obj/machinery/mineral/labor_claim_console/emag_act(mob/user) if(!emagged) +======= + +/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id/prisoner)) + if(!inserted_id) + if(!user.transferItemToLoc(I, src)) + return + inserted_id = I + to_chat(user, "You insert [I].") + return + else + to_chat(user, "There's an ID inserted already.") + return ..() + +/obj/machinery/mineral/labor_claim_console/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "labor_claim_console", name, 450, 475, master_ui, state) + ui.open() + +/obj/machinery/mineral/labor_claim_console/ui_data(mob/user) + var/list/data = list() + var/can_go_home = FALSE + + data["emagged"] = emagged + if(inserted_id) + data["id"] = inserted_id + data["id_name"] = inserted_id.registered_name + data["points"] = inserted_id.points + data["goal"] = inserted_id.goal + if(check_auth()) + can_go_home = TRUE + + var/list/ores = list() + if(stacking_machine) + data["unclaimed_points"] = stacking_machine.points + for(var/ore in stacking_machine.ore_values) + var/list/O = list() + O["ore"] = ore + O["value"] = stacking_machine.ore_values[ore] + ores += list(O) + + data["ores"] = ores + data["can_go_home"] = can_go_home + + return data + +/obj/machinery/mineral/labor_claim_console/ui_act(action, params) + if(..()) + return + switch(action) + if("handle_id") + if(inserted_id) + if(!usr.get_active_held_item()) + usr.put_in_hands(inserted_id) + inserted_id = null + else + inserted_id.forceMove(get_turf(src)) + inserted_id = null + else + var/obj/item/I = usr.get_active_held_item() + if(istype(I, /obj/item/card/id/prisoner)) + if(!usr.transferItemToLoc(I, src)) + return + inserted_id = I + if("claim_points") + inserted_id.points += stacking_machine.points + stacking_machine.points = 0 + to_chat(usr, "Points transferred.") + if("move_shuttle") + if(!alone_in_area(get_area(src), usr)) + to_chat(usr, "Prisoners are only allowed to be released while alone.") + else + switch(SSshuttle.moveShuttle("laborcamp","laborcamp_home")) + if(1) + to_chat(usr, "Shuttle not found") + if(2) + to_chat(usr, "Shuttle already at station") + if(3) + to_chat(usr, "No permission to dock could be granted.") + else + if(!emagged) + Radio.set_frequency(GLOB.SEC_FREQ) + Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", GLOB.SEC_FREQ, get_spans(), get_default_language()) + to_chat(usr, "Shuttle received message and will be sent shortly.") + +/obj/machinery/mineral/labor_claim_console/proc/check_auth() + if(emagged) + return 1 //Shuttle is emagged, let any ol' person through + return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. + +/obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() + stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) + if(stacking_machine) + stacking_machine.CONSOLE = src + else + qdel(src) + +/obj/machinery/mineral/labor_claim_console/emag_act(mob/user) + if(!emagged) +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) emagged = TRUE to_chat(user, "PZZTTPFFFT") diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 95c4898605..efc46faa31 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1005,7 +1005,7 @@ if(H == L) continue to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") - H.put_in_hands_or_del(new /obj/item/kitchen/knife/butcher(H)) + H.put_in_hands(new /obj/item/kitchen/knife/butcher(H), TRUE) qdel(src) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 38e02474f4..437073a1fc 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -166,9 +166,8 @@ if(istype(W, /obj/item/card/id)) var/obj/item/card/id/I = user.get_active_held_item() if(istype(I) && !istype(inserted_id)) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.forceMove(src) inserted_id = I interact(user) return diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 8ae3632d34..5a228973ce 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -116,9 +116,8 @@ else if(href_list["choice"] == "insert") var/obj/item/card/id/I = usr.get_active_held_item() if(istype(I)) - if(!usr.drop_item()) + if(!usr.transferItemToLoc(I, src)) return - I.loc = src inserted_id = I to_chat(usr, "You insert the ID into [src]'s card slot.") else @@ -155,9 +154,8 @@ if(istype(I, /obj/item/card/id)) var/obj/item/card/id/C = usr.get_active_held_item() if(istype(C) && !istype(inserted_id)) - if(!usr.drop_item()) + if(!usr.transferItemToLoc(C, src)) return - C.loc = src inserted_id = C to_chat(usr, "You insert the ID into [src]'s card slot.") interact(user) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 2836bd67f8..17c89b3af9 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -11,9 +11,7 @@ /obj/structure/ore_box/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/ore)) - if(!user.drop_item()) - return - W.forceMove(src) + user.transferItemToLoc(W, src) else if (istype(W, /obj/item/storage)) var/obj/item/storage/S = W for(var/obj/item/ore/O in S.contents) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 59e7db1286..486a918c06 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -222,26 +222,10 @@ I.dropped(src) return FALSE - -/mob/proc/put_in_hands_or_del(obj/item/I) - return put_in_hands(I, TRUE) - - -/mob/proc/drop_item_v() //this is dumb. - if(stat == CONSCIOUS && isturf(loc)) - return drop_item() - return FALSE - - /mob/proc/drop_all_held_items() + . = FALSE for(var/obj/item/I in held_items) - dropItemToGround(I) - -//Drops the item in our active hand. -/mob/proc/drop_item() - var/obj/item/held = get_active_held_item() - return dropItemToGround(held) - + . |= dropItemToGround(I) //Here lie drop_from_inventory and before_item_take, already forgotten and not missed. diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index aa15e28e66..6ac5ab1bad 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -115,9 +115,8 @@ //since these people will be dead M != usr if(!C.getorgan(/obj/item/organ/brain)) - if(!C.get_bodypart("head")) + if(!C.get_bodypart("head") || !C.temporarilyRemoveItemFromInventory(src)) return - user.drop_item() var/msg = "[C] has [src] inserted into [C.p_their()] head by [user]." if(C == user) msg = "[user] inserts [src] into [user.p_their()] head!" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index a09734ff49..36ed5ec884 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -51,7 +51,7 @@ "[M] has pushed down [src]!") else if (prob(50)) - drop_item() + dropItemToGround(get_active_held_item()) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) visible_message("[M] has disarmed [src]!", \ "[M] has disarmed [src]!", null, COMBAT_MESSAGE_RANGE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b4a57ea361..7be010b3ba 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -205,7 +205,7 @@ return 0 if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stunned instead. - if(get_active_held_item() && drop_item()) + if(dropItemToGround(get_active_held_item())) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("[M] disarmed [src]!", \ "[M] disarmed [src]!") @@ -259,7 +259,7 @@ damage_clothes(damage, BRUTE, "melee", affecting.body_zone) if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. - if(get_active_held_item() && drop_item()) + if(dropItemToGround(get_active_held_item())) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("[M] disarmed [src]!", \ "[M] disarmed [src]!") diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index 51b65bf44f..35e83a8e04 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -657,7 +657,7 @@ insert_into_backpack() //---------FASHION if(istype(TARGET, /obj/item/clothing)) - drop_item() + temporarilyRemoveItemFromInventory(TARGET, TRUE) dressup(TARGET) update_hands = 1 if(MYPDA in src.loc || MYID in src.loc) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 34d4ae8e51..12131ea94e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1373,7 +1373,7 @@ target.stop_pulling() else I = target.get_active_held_item() - if(target.drop_item()) + if(target.dropItemToGround(I)) target.visible_message("[user] has disarmed [target]!", \ "[user] has disarmed [target]!", null, COMBAT_MESSAGE_RANGE) else diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index d95b10a148..96cafa4501 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -74,11 +74,9 @@ add_logs(M, src, "pushed") visible_message("[M] has pushed down [src]!", \ "[M] has pushed down [src]!", null, COMBAT_MESSAGE_RANGE) - else - if(drop_item()) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has disarmed [src]!", \ - "[M] has disarmed [src]!", null, COMBAT_MESSAGE_RANGE) + else if(dropItemToGround(get_active_held_item())) + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + visible_message("[M] has disarmed [src]!", "[M] has disarmed [src]!", null, COMBAT_MESSAGE_RANGE) /mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) if(..()) //if harm or disarm intent. @@ -119,12 +117,10 @@ "[M] has tackled down [name]!", null, COMBAT_MESSAGE_RANGE) else I = get_active_held_item() - if(drop_item()) - visible_message("[M] has disarmed [name]!", \ - "[M] has disarmed [name]!", null, COMBAT_MESSAGE_RANGE) + if(dropItemToGround(I)) + visible_message("[M] has disarmed [name]!", "[M] has disarmed [name]!", null, COMBAT_MESSAGE_RANGE) else - I = null//did not manage to actually disarm the item, gross but no time to refactor - + I = null add_logs(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") updatehealth() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f8e4c4d752..5f995956be 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -427,9 +427,8 @@ else if(cell) to_chat(user, "There is a power cell already installed!") else - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - W.loc = src cell = W to_chat(user, "You insert the power cell.") update_icons() @@ -518,7 +517,7 @@ else if(U.locked) to_chat(user, "The upgrade is locked and cannot be used yet!") else - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(U)) return if(U.action(src)) to_chat(user, "You apply the upgrade to [src].") @@ -529,12 +528,13 @@ upgrades += U else to_chat(user, "Upgrade error.") + U.forceMove(drop_location()) else if(istype(W, /obj/item/device/toner)) if(toner >= tonermax) to_chat(user, "The toner level of [src] is at its highest level possible!") else - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(W)) return toner = tonermax qdel(W) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 562b51945b..c15c287f7c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/living/silicon gender = NEUTER voice_name = "synthesized voice" @@ -384,3 +385,388 @@ /mob/living/silicon/is_literate() return 1 +======= +/mob/living/silicon + gender = NEUTER + voice_name = "synthesized voice" + has_unlimited_silicon_privilege = 1 + verb_say = "states" + verb_ask = "queries" + verb_exclaim = "declares" + verb_yell = "alarms" + initial_language_holder = /datum/language_holder/synthetic + see_in_dark = 8 + bubble_icon = "machine" + weather_immunities = list("ash") + possible_a_intents = list(INTENT_HELP, INTENT_HARM) + + var/syndicate = 0 + var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS + var/last_lawchange_announce = 0 + var/list/alarms_to_show = list() + var/list/alarms_to_clear = list() + var/designation = "" + var/radiomod = "" //Radio character used before state laws/arrivals announce to allow department transmissions, default, or none at all. + var/obj/item/device/camera/siliconcam/aicamera = null //photography + hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_TRACK_HUD) + + var/obj/item/device/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say() + + var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) + var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) + + var/lawcheck[1] + var/ioncheck[1] + var/devillawcheck[5] + + var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use + var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use + var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud + + var/law_change_counter = 0 + var/obj/machinery/camera/builtInCamera = null + var/updating = FALSE //portable camera camerachunk update + +/mob/living/silicon/Initialize() + . = ..() + GLOB.silicon_mobs += src + var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_to_hud(src) + diag_hud_set_status() + diag_hud_set_health() + +/mob/living/silicon/med_hud_set_health() + return //we use a different hud + +/mob/living/silicon/med_hud_set_status() + return //we use a different hud + +/mob/living/silicon/Destroy() + radio = null + aicamera = null + QDEL_NULL(builtInCamera) + GLOB.silicon_mobs -= src + return ..() + +/mob/living/silicon/contents_explosion(severity, target) + return + +/mob/living/silicon/proc/cancelAlarm() + return + +/mob/living/silicon/proc/triggerAlarm() + return + +/mob/living/silicon/proc/queueAlarm(message, type, incoming = 1) + var/in_cooldown = (alarms_to_show.len > 0 || alarms_to_clear.len > 0) + if(incoming) + alarms_to_show += message + alarm_types_show[type] += 1 + else + alarms_to_clear += message + alarm_types_clear[type] += 1 + + if(!in_cooldown) + spawn(3 * 10) // 3 seconds + + if(alarms_to_show.len < 5) + for(var/msg in alarms_to_show) + to_chat(src, msg) + else if(alarms_to_show.len) + + var/msg = "--- " + + if(alarm_types_show["Burglar"]) + msg += "BURGLAR: [alarm_types_show["Burglar"]] alarms detected. - " + + if(alarm_types_show["Motion"]) + msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - " + + if(alarm_types_show["Fire"]) + msg += "FIRE: [alarm_types_show["Fire"]] alarms detected. - " + + if(alarm_types_show["Atmosphere"]) + msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - " + + if(alarm_types_show["Power"]) + msg += "POWER: [alarm_types_show["Power"]] alarms detected. - " + + if(alarm_types_show["Camera"]) + msg += "CAMERA: [alarm_types_show["Camera"]] alarms detected. - " + + msg += "\[Show Alerts\]" + to_chat(src, msg) + + if(alarms_to_clear.len < 3) + for(var/msg in alarms_to_clear) + to_chat(src, msg) + + else if(alarms_to_clear.len) + var/msg = "--- " + + if(alarm_types_clear["Motion"]) + msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - " + + if(alarm_types_clear["Fire"]) + msg += "FIRE: [alarm_types_clear["Fire"]] alarms cleared. - " + + if(alarm_types_clear["Atmosphere"]) + msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - " + + if(alarm_types_clear["Power"]) + msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - " + + if(alarm_types_show["Camera"]) + msg += "CAMERA: [alarm_types_clear["Camera"]] alarms cleared. - " + + msg += "\[Show Alerts\]" + to_chat(src, msg) + + + alarms_to_show = list() + alarms_to_clear = list() + for(var/key in alarm_types_show) + alarm_types_show[key] = 0 + for(var/key in alarm_types_clear) + alarm_types_clear[key] = 0 + +/mob/living/silicon/can_inject(mob/user, error_msg) + if(error_msg) + to_chat(user, "Their outer shell is too tough.") + return 0 + +/mob/living/silicon/IsAdvancedToolUser() + return 1 + +/proc/islinked(mob/living/silicon/robot/bot, mob/living/silicon/ai/ai) + if(!istype(bot) || !istype(ai)) + return 0 + if (bot.connected_ai == ai) + return 1 + return 0 + +/mob/living/silicon/Topic(href, href_list) + if (href_list["lawc"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite + var/L = text2num(href_list["lawc"]) + switch(lawcheck[L+1]) + if ("Yes") + lawcheck[L+1] = "No" + if ("No") + lawcheck[L+1] = "Yes" + checklaws() + + if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite + var/L = text2num(href_list["lawi"]) + switch(ioncheck[L]) + if ("Yes") + ioncheck[L] = "No" + if ("No") + ioncheck[L] = "Yes" + checklaws() + + if (href_list["lawdevil"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite + var/L = text2num(href_list["lawdevil"]) + switch(devillawcheck[L]) + if ("Yes") + devillawcheck[L] = "No" + if ("No") + devillawcheck[L] = "Yes" + checklaws() + + + if (href_list["laws"]) // With how my law selection code works, I changed statelaws from a verb to a proc, and call it through my law selection panel. --NeoFite + statelaws() + + return + + +/mob/living/silicon/proc/statelaws(force = 0) + + //"radiomod" is inserted before a hardcoded message to change if and how it is handled by an internal radio. + src.say("[radiomod] Current Active Laws:") + //src.laws_sanity_check() + //src.laws.show_laws(world) + var/number = 1 + sleep(10) + + if (src.laws.devillaws && src.laws.devillaws.len) + for(var/index = 1, index <= src.laws.devillaws.len, index++) + if (force || src.devillawcheck[index] == "Yes") + src.say("[radiomod] 666. [src.laws.devillaws[index]]") + sleep(10) + + + if (src.laws.zeroth) + if (force || src.lawcheck[1] == "Yes") + src.say("[radiomod] 0. [src.laws.zeroth]") + sleep(10) + + for (var/index = 1, index <= src.laws.ion.len, index++) + var/law = src.laws.ion[index] + var/num = ionnum() + if (length(law) > 0) + if (force || src.ioncheck[index] == "Yes") + src.say("[radiomod] [num]. [law]") + sleep(10) + + for (var/index = 1, index <= src.laws.inherent.len, index++) + var/law = src.laws.inherent[index] + + if (length(law) > 0) + if (force || src.lawcheck[index+1] == "Yes") + src.say("[radiomod] [number]. [law]") + number++ + sleep(10) + + for (var/index = 1, index <= src.laws.supplied.len, index++) + var/law = src.laws.supplied[index] + + if (length(law) > 0) + if(src.lawcheck.len >= number+1) + if (force || src.lawcheck[number+1] == "Yes") + src.say("[radiomod] [number]. [law]") + number++ + sleep(10) + + +/mob/living/silicon/proc/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite + + var/list = "Which laws do you want to include when stating them for the crew?

" + + if (src.laws.devillaws && src.laws.devillaws.len) + for(var/index = 1, index <= src.laws.devillaws.len, index++) + if (!src.devillawcheck[index]) + src.devillawcheck[index] = "No" + list += {"[src.devillawcheck[index]] 666: [src.laws.devillaws[index]]
"} + + if (src.laws.zeroth) + if (!src.lawcheck[1]) + src.lawcheck[1] = "No" //Given Law 0's usual nature, it defaults to NOT getting reported. --NeoFite + list += {"[src.lawcheck[1]] 0: [src.laws.zeroth]
"} + + for (var/index = 1, index <= src.laws.ion.len, index++) + var/law = src.laws.ion[index] + + if (length(law) > 0) + if (!src.ioncheck[index]) + src.ioncheck[index] = "Yes" + list += {"[src.ioncheck[index]] [ionnum()]: [law]
"} + src.ioncheck.len += 1 + + var/number = 1 + for (var/index = 1, index <= src.laws.inherent.len, index++) + var/law = src.laws.inherent[index] + + if (length(law) > 0) + src.lawcheck.len += 1 + + if (!src.lawcheck[number+1]) + src.lawcheck[number+1] = "Yes" + list += {"[src.lawcheck[number+1]] [number]: [law]
"} + number++ + + for (var/index = 1, index <= src.laws.supplied.len, index++) + var/law = src.laws.supplied[index] + if (length(law) > 0) + src.lawcheck.len += 1 + if (!src.lawcheck[number+1]) + src.lawcheck[number+1] = "Yes" + list += {"[src.lawcheck[number+1]] [number]: [law]
"} + number++ + list += {"

State Laws"} + + usr << browse(list, "window=laws") + +/mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals). + if(!radio) + to_chat(src, "Radio not detected.") + return + + //Ask the user to pick a channel from what it has available. + var/Autochan = input("Select a channel:") as null|anything in list("Default","None") + radio.channels + + if(!Autochan) + return + if(Autochan == "Default") //Autospeak on whatever frequency to which the radio is set, usually Common. + radiomod = ";" + Autochan += " ([radio.frequency])" + else if(Autochan == "None") //Prevents use of the radio for automatic annoucements. + radiomod = "" + else //For department channels, if any, given by the internal radio. + for(var/key in GLOB.department_radio_keys) + if(GLOB.department_radio_keys[key] == Autochan) + radiomod = ":" + key + break + + to_chat(src, "Automatic announcements [Autochan == "None" ? "will not use the radio." : "set to [Autochan]."]") + +/mob/living/silicon/put_in_hand_check() // This check is for borgs being able to receive items, not put them in others' hands. + return 0 + +// The src mob is trying to place an item on someone +// But the src mob is a silicon!! Disable. +/mob/living/silicon/stripPanelEquip(obj/item/what, mob/who, slot) + return 0 + + +/mob/living/silicon/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units + return -10 + +/mob/living/silicon/proc/remove_med_sec_hud() + var/datum/atom_hud/secsensor = GLOB.huds[sec_hud] + var/datum/atom_hud/medsensor = GLOB.huds[med_hud] + var/datum/atom_hud/diagsensor = GLOB.huds[d_hud] + secsensor.remove_hud_from(src) + medsensor.remove_hud_from(src) + diagsensor.remove_hud_from(src) + +/mob/living/silicon/proc/add_sec_hud() + var/datum/atom_hud/secsensor = GLOB.huds[sec_hud] + secsensor.add_hud_to(src) + +/mob/living/silicon/proc/add_med_hud() + var/datum/atom_hud/medsensor = GLOB.huds[med_hud] + medsensor.add_hud_to(src) + +/mob/living/silicon/proc/add_diag_hud() + var/datum/atom_hud/diagsensor = GLOB.huds[d_hud] + diagsensor.add_hud_to(src) + +/mob/living/silicon/proc/sensor_mode() + if(incapacitated()) + return + var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical","Diagnostic","Disable") + remove_med_sec_hud() + switch(sensor_type) + if ("Security") + add_sec_hud() + to_chat(src, "Security records overlay enabled.") + if ("Medical") + add_med_hud() + to_chat(src, "Life signs monitor overlay enabled.") + if ("Diagnostic") + add_diag_hud() + to_chat(src, "Robotics diagnostic overlay enabled.") + if ("Disable") + to_chat(src, "Sensor augmentations disabled.") + + +/mob/living/silicon/proc/GetPhoto() + if (aicamera) + return aicamera.selectpicture(aicamera) + +/mob/living/silicon/update_transform() + var/matrix/ntransform = matrix(transform) //aka transform.Copy() + var/changed = 0 + if(resize != RESIZE_DEFAULT_SIZE) + changed++ + ntransform.Scale(resize) + resize = RESIZE_DEFAULT_SIZE + + if(changed) + animate(src, transform = ntransform, time = 2,easing = EASE_IN|EASE_OUT) + return ..() + +/mob/living/silicon/is_literate() + return 1 +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 1afcdaaed4..98b1b46ed8 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -846,9 +846,8 @@ Pass a positive integer as an argument to override a bot's default speed. else if(allow_pai && !key) if(!locked && !open) if(card.pai && card.pai.mind) - if(!user.drop_item()) + if(!user.transferItemToLoc(card, src)) return - card.forceMove(src) paicard = card user.visible_message("[user] inserts [card] into [src]!","You insert [card] into [src].") paicard.pai.mind.transfer_to(src) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index bbbe4e310c..3a46e46beb 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -223,10 +223,9 @@ if(!isnull(reagent_glass)) to_chat(user, "There is already a beaker loaded!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - W.loc = src reagent_glass = W to_chat(user, "You insert [W].") show_controls(user) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index e6a4b978ca..6130d92aff 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -84,11 +84,9 @@ if(open) on = FALSE else if(istype(I, /obj/item/stock_parts/cell) && open && !cell) - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - var/obj/item/stock_parts/cell/C = I - C.loc = src - cell = C + cell = I visible_message("[user] inserts a cell into [src].", "You insert the new cell into [src].") else if(istype(I, /obj/item/crowbar) && open && cell) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 6467990776..35b4b37445 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -174,7 +174,7 @@ usr.visible_message("[usr] pets [src].","You rest your hand on [src]'s back for a moment.") return - if(!usr.drop_item()) + if(!usr.temporarilyRemoveItemFromInventory(item_to_add)) to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!") return @@ -189,7 +189,7 @@ if(!allowed) to_chat(usr, "You set [item_to_add] on [src]'s back, but it falls off!") - item_to_add.loc = loc + item_to_add.forceMove(drop_location()) if(prob(25)) step_rand(item_to_add) for(var/i in list(1,2,4,8,4,8,4,dir)) @@ -197,8 +197,7 @@ sleep(1) return - usr.drop_item() - item_to_add.loc = src + item_to_add.forceMove(src) src.inventory_back = item_to_add update_corgi_fluff() regenerate_icons() @@ -226,7 +225,7 @@ user.visible_message("[user] pets [src].","You rest your hand on [src]'s head for a moment.") return - if(user && !user.drop_item()) + if(user && !user.temporarilyRemoveItemFromInventory(item_to_add)) to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!") return 0 @@ -243,13 +242,13 @@ user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.", "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks.", "You hear a friendly-sounding bark.") - item_to_add.loc = src + item_to_add.forceMove(src) src.inventory_head = item_to_add update_corgi_fluff() regenerate_icons() else to_chat(user, "You set [item_to_add] on [src]'s head, but it falls off!") - item_to_add.loc = loc + item_to_add.forceMove(drop_location()) if(prob(25)) step_rand(item_to_add) for(var/i in list(1,2,4,8,4,8,4,dir)) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index c29236c2fc..6fb1c500b2 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -275,7 +275,6 @@ if(!stat && eggsleft < 8) var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]" user.visible_message(feedmsg) - user.drop_item() qdel(O) eggsleft += rand(1, 4) else diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 09d9f66f61..7ceffa198b 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -246,8 +246,8 @@ var/obj/item/device/radio/headset/headset_to_add = item_to_add - usr.drop_item() - headset_to_add.loc = src + if(!usr.transferItemToLoc(headset_to_add, src)) + return src.ears = headset_to_add to_chat(usr, "You fit the headset onto [src].") @@ -340,7 +340,6 @@ drop_held_item(0) else if(istype(O, /obj/item/reagent_containers/food/snacks/cracker)) //Poly wants a cracker. qdel(O) - user.drop_item() if(health < maxHealth) adjustBruteLoss(-10) speak_chance *= 1.27 // 20 crackers to go from 1% to 100% diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 4da630bb31..a66b45d4a2 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -53,10 +53,11 @@ /client/Northwest() - if(!usr.get_active_held_item()) + var/obj/item/I = usr.get_active_held_item() + if(!I) to_chat(usr, "You have nothing to drop in your hand!") return - usr.drop_item() + usr.dropItemToGround(I) //This gets called when you press the delete button. /client/verb/delete_key_pressed() @@ -85,8 +86,8 @@ /client/verb/drop_item() set hidden = 1 - if(!iscyborg(mob)) - mob.drop_item_v() + if(!iscyborg(mob) && mob.stat == CONSCIOUS) + mob.dropItemToGround(mob.get_active_held_item()) return diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index ead6a35eea..0562bf700d 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -175,9 +175,8 @@ else var/obj/item/I = usr.get_active_held_item() if (istype(I, /obj/item/card/id)) - if(!usr.drop_item()) + if(!usr.transferItemToLoc(I, computer)) return - I.forceMove(computer) card_slot.stored_card = I if("auth") if(auth_card) @@ -191,9 +190,8 @@ else var/obj/item/I = usr.get_active_held_item() if (istype(I, /obj/item/card/id)) - if(!usr.drop_item()) + if(!usr.transferItemToLoc(I, computer)) return - I.forceMove(computer) card_slot.stored_card2 = I if("PRG_terminate") if(computer && ((id_card.assignment in head_subordinates) || id_card.assignment == "Assistant")) diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index adec1aa19d..99eb6f1a23 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -244,7 +244,7 @@ if(istype(I, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/c = I - if(!user.drop_item(c)) + if(!user.temporarilyRemoveItemFromInventory(c)) return credits += c.value visible_message("[usr] inserts [c.value] credits into the [src].") diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index f8c4cf1f73..8b4be79e99 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -47,10 +47,9 @@ /obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/documents)) - if(!user.drop_item()) + if(!user.transferItemToLoc(P, src)) return to_chat(user, "You put [P] in [src].") - P.loc = src icon_state = "[initial(icon_state)]-open" sleep(5) icon_state = initial(icon_state) diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 2c704b8568..4a85d03df7 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -44,16 +44,15 @@ /obj/item/papercutter/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/paper) && !storedpaper) - if(!user.drop_item()) + if(!user.transferItemToLoc(P, src)) return playsound(loc, "pageturn", 60, 1) to_chat(user, "You place [P] in [src].") - P.loc = src storedpaper = P update_icon() return if(istype(P, /obj/item/hatchet/cutterblade) && !storedcutter) - if(!user.drop_item()) + if(!user.transferItemToLoc(P, src)) return to_chat(user, "You replace [src]'s [P].") P.loc = src diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 0dcd5d09a0..d4e78c4ef3 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -240,7 +240,7 @@ updateUsrDialog() /obj/machinery/photocopier/proc/do_insertion(obj/item/O, mob/user) - O.loc = src + O.forceMove(src) to_chat(user, "You insert [O] into [src].") flick("photocopier1", src) updateUsrDialog() @@ -261,7 +261,7 @@ resistance_flags |= FLAMMABLE fire_act() else - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(O)) return copy = O do_insertion(O, user) @@ -270,7 +270,7 @@ else if(istype(O, /obj/item/photo)) if(copier_empty()) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(O)) return photocopy = O do_insertion(O, user) @@ -279,7 +279,7 @@ else if(istype(O, /obj/item/documents)) if(copier_empty()) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(O)) return doccopy = O do_insertion(O, user) @@ -288,7 +288,7 @@ else if(istype(O, /obj/item/device/toner)) if(toner <= 0) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(O)) return qdel(O) toner = 40 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 8e20925f9b..ad3e2c9d33 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -449,9 +449,8 @@ if (stat & MAINT) to_chat(user, "There is no connector for your power cell!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(W, src)) return - W.forceMove(src) cell = W user.visible_message(\ "[user.name] has inserted the power cell to [src.name]!",\ diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 096c050fcc..8634e5af5b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -315,7 +315,7 @@ src.add_fingerprint(user) var/obj/item/light/L = W if(istype(L, light_type)) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory()) return src.add_fingerprint(user) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 8399f73e79..9b5592af3b 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -87,10 +87,9 @@ GLOBAL_LIST_EMPTY(rad_collectors) if(loaded_tank) to_chat(user, "There's already a plasma tank loaded!") return TRUE - if(!user.drop_item()) - return TRUE + if(!user.transferItemToLoc(W, src)) + return loaded_tank = W - W.forceMove(src) update_icons() else if(istype(W, /obj/item/crowbar)) if(loaded_tank) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index dcc8c0a200..fb530f128f 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -240,7 +240,7 @@ if(!tracker) if(istype(W, /obj/item/electronics/tracker)) - if(!user.drop_item()) + if(!user.temporarilyRemoveItemFromInventory(W)) return tracker = 1 qdel(W) diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/box_magazine.dm index 29e27d18ba..324470ede4 100644 --- a/code/modules/projectiles/box_magazine.dm +++ b/code/modules/projectiles/box_magazine.dm @@ -81,8 +81,7 @@ if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/AC = A if(give_round(AC, replace_spent)) - user.drop_item() - AC.forceMove(src) + user.transferItemToLoc(AC, src, TRUE) num_loaded++ if(num_loaded) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e5767e48ba..564bcd04d8 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -164,7 +164,7 @@ to_chat(user, "You shoot yourself in the foot with [src]!") var/shot_leg = pick("l_leg", "r_leg") process_fire(user,user,0,params, zone_override = shot_leg) - user.drop_item() + user.dropItemToGround(src, TRUE) return if(weapon_weight == WEAPON_HEAVY && user.get_inactive_held_item()) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 44bada2771..7c0ec28a44 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -358,5 +358,5 @@ if(process_fire(user, user, 0, zone_override = "head")) user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!") user.emote("scream") - user.drop_item() + user.drop_all_held_items() user.Knockdown(80) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index bbaf20689c..6cd603c8d1 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -172,11 +172,11 @@ if(guns_left) var/obj/item/gun/ballistic/shotgun/boltaction/enchanted/GUN = new gun_type GUN.guns_left = guns_left - 1 - user.drop_item() + user.dropItemToGround(src, TRUE) user.swap_hand() user.put_in_hands(GUN) else - user.drop_item() + user.dropItemToGround(src, TRUE) discard_gun(user) // Automatic Shotguns// diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 5ee2ecec05..8772ae05c0 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -49,12 +49,11 @@ if(!T.tank_one || !T.tank_two) to_chat(user, "What good would an incomplete bomb do?") return FALSE - if(!user.drop_item(O)) + if(!user.transferItemToLoc(O, src)) to_chat(user, "The [O] seems to be stuck to your hand!") return FALSE user.visible_message("[user] attaches the [O] to the [src]!") bomb = O - O.forceMove(src) update_icon() return TRUE return ..() diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 8fdb973ef6..a6f6782d30 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -189,9 +189,7 @@ M.emote("laugh") if(prob(33)) M.visible_message("[M]'s hands flip out and flail everywhere!") - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() + M.drop_all_held_items() ..() M.adjustToxLoss(1, 0) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) @@ -268,9 +266,7 @@ if(prob(20)) M.emote(pick("twitch","drool","moan")) if(prob(33)) - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() + M.drop_all_held_items() ..() /datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 72001d5ca9..f1b076ca68 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -256,7 +256,6 @@ victim.confused = max(M.confused, 3) victim.damageoverlaytemp = 60 victim.Knockdown(60) - victim.drop_item() return else if ( eyes_covered ) // Eye cover is better than mouth cover victim.blur_eyes(3) @@ -270,7 +269,6 @@ victim.confused = max(M.confused, 6) victim.damageoverlaytemp = 75 victim.Knockdown(100) - victim.drop_item() victim.update_damage_hud() /datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index ab9d95582b..01d50fb606 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -626,27 +626,20 @@ /datum/reagent/medicine/morphine/overdose_process(mob/living/M) if(prob(33)) - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() + M.drop_all_held_items() M.Dizzy(2) M.Jitter(2) ..() /datum/reagent/medicine/morphine/addiction_act_stage1(mob/living/M) if(prob(33)) - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() - M.Dizzy(2) + M.drop_all_held_items() M.Jitter(2) ..() /datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M) if(prob(33)) - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() + M.drop_all_held_items() M.adjustToxLoss(1*REM, 0) . = 1 M.Dizzy(3) @@ -655,9 +648,7 @@ /datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M) if(prob(33)) - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() + M.drop_all_held_items() M.adjustToxLoss(2*REM, 0) . = 1 M.Dizzy(4) @@ -666,9 +657,7 @@ /datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M) if(prob(33)) - var/obj/item/I = M.get_active_held_item() - if(I) - M.drop_item() + M.drop_all_held_items() M.adjustToxLoss(3*REM, 0) . = 1 M.Dizzy(5) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 49e375b723..2a194ee95c 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -141,8 +141,7 @@ to_chat(user, "You reverse [src]'s direction.") else if(user.a_intent != INTENT_HARM) - if(user.drop_item()) - I.loc = src.loc + user.transferItemToLoc(I, drop_location()) else return ..() diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 517b4aa195..9fdc62c8d2 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -96,7 +96,7 @@ return if(user.a_intent != INTENT_HARM) - if(!user.drop_item() || (I.flags_1 & ABSTRACT_1)) + if((I.flags_1 & ABSTRACT_1) || !user.temporarilyRemoveItemFromInventory(I)) return place_item_in_disposal(I, user) update_icon() diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 5d3cde7aac..790cba0889 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -43,12 +43,11 @@ Note: Must be placed within 3 tiles of the R&D Console if (temp_tech.len == 0) to_chat(user, "You cannot deconstruct this item!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) to_chat(user, "\The [O] is stuck to your hand, you cannot put it in the [src.name]!") return busy = TRUE loaded_item = O - O.forceMove(src) to_chat(user, "You add the [O.name] to the [src.name]!") flick("d_analyzer_la", src) addtimer(CALLBACK(src, .proc/finish_loading), 10) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 4d8938b1b8..3a2b1f6b7f 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -122,10 +122,9 @@ if (temp_tech.len == 0) to_chat(user, "You cannot experiment on this item!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(O, src)) return loaded_item = O - O.loc = src to_chat(user, "You add the [O.name] to the machine.") flick("h_lathe_load", src) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 70e4bf7f62..efb64c6623 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -127,9 +127,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, else to_chat(user, "Machine cannot accept disks in that format.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(D, src)) return - D.loc = src to_chat(user, "You add the disk to the machine!") else if(!(linked_destroy && linked_destroy.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy)) . = ..() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 1be515f177..02180b273f 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -70,7 +70,6 @@ if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) monkeys++ to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") - user.drop_item() qdel(O) return else if(istype(O, /obj/item/storage/bag)) diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index 08837c956d..c73c5de58a 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -75,9 +75,8 @@ item = null else for(var/mob/living/carbon/C in targets) - if(C.drop_item()) - item = make_item() - C.put_in_hands(item) + if(C.dropItemToGround(C.get_active_held_item())) + C.put_in_hands(make_item(), TRUE) /obj/effect/proc_holder/spell/targeted/conjure_item/Destroy() if(item) diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 9d1afdcebc..b1867413a3 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -49,7 +49,7 @@ for(var/mob/living/carbon/C in targets) if(C.mind && user.mind) if(C.stat == DEAD) - if(user.drop_item()) + if(user.dropItemToGround(user.get_active_held_item())) var/obj/item/paper/contract/infernal/revive/contract = new(user.loc, C.mind, user.mind) user.put_in_hands(contract) else diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm index a0be169d85..5d335745d2 100644 --- a/code/modules/spells/spell_types/devil_boons.dm +++ b/code/modules/spells/spell_types/devil_boons.dm @@ -14,7 +14,7 @@ /obj/effect/proc_holder/spell/targeted/summon_wealth/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/C in targets) - if(user.drop_item()) + if(user.dropItemToGround(user.get_active_held_item())) var/obj/item = pick( new /obj/item/coin/gold(user.loc), new /obj/item/coin/diamond(user.loc), diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm index 6036d1a70b..feb6eeddb6 100644 --- a/code/modules/spells/spell_types/infinite_guns.dm +++ b/code/modules/spells/spell_types/infinite_guns.dm @@ -14,12 +14,9 @@ /obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/C in targets) - C.drop_item() - C.swap_hand() - C.drop_item() + C.drop_all_held_items() var/GUN = new summon_path C.put_in_hands(GUN) - C.swap_hand(C.get_held_index_of_item(GUN)) /obj/effect/proc_holder/spell/targeted/infinite_guns/gun diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index a37502a96b..8bad429102 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -29,9 +29,8 @@ return 0 else user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!", "You stuff [tool] into [target]'s [target_zone].") - user.drop_item() + user.transferItemToLoc(tool, target, TRUE) CH.cavity_item = tool - tool.loc = target return 1 else if(IC) diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index db3771ad21..0073c59f8d 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -15,8 +15,7 @@ if(!istype(tool)) return 0 - user.drop_item() - tool.loc = target + user.transferItemToLoc(tool, target, TRUE) var/datum/action/item_action/hands_free/activate_pill/P = new(tool) P.button.name = "Activate [tool.name]" diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 6272039201..4df1d847be 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /////AUGMENTATION SURGERIES////// @@ -57,6 +58,66 @@ qdel(tool) target.update_body_parts() target.updatehealth() +======= + +/////AUGMENTATION SURGERIES////// + + +//SURGERY STEPS + +/datum/surgery_step/replace + name = "sever muscles" + implements = list(/obj/item/scalpel = 100, /obj/item/wirecutters = 55) + time = 32 + + +/datum/surgery_step/replace/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_selected)].", "You begin to sever the muscles on [target]'s [parse_zone(user.zone_selected)]...") + + +/datum/surgery_step/add_limb + name = "replace limb" + implements = list(/obj/item/bodypart = 100) + time = 32 + var/obj/item/bodypart/L = null // L because "limb" + + +/datum/surgery_step/add_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/obj/item/bodypart/aug = tool + if(aug.status != BODYPART_ROBOTIC) + to_chat(user, "that's not an augment silly!") + return -1 + if(aug.body_zone != target_zone) + to_chat(user, "[tool] isn't the right type for [parse_zone(target_zone)].") + return -1 + L = surgery.operated_bodypart + if(L) + user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_selected)].", "You begin to augment [target]'s [parse_zone(user.zone_selected)]...") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + + +//ACTUAL SURGERIES + +/datum/surgery/augmentation + name = "augmentation" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/add_limb) + species = list(/mob/living/carbon/human) + possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head") + requires_real_bodypart = TRUE + +//SURGERY STEP SUCCESSES + +/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery) + if(L) + user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "You successfully augment [target]'s [parse_zone(target_zone)].") + L.change_bodypart_status(BODYPART_ROBOTIC, TRUE) + L.icon = tool.icon + L.max_damage = tool.max_damage + qdel(tool) + target.update_body_parts() + target.updatehealth() +>>>>>>> b6d349e... Remove drop_item, drop_item_v, put_in_hands_or_del (#31386) target.update_hair() add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]") else diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 4ba9faaf41..f30d45e422 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -127,7 +127,7 @@ tool = I else I = tool - user.drop_item() + user.temporarilyRemoveItemFromInventory(I, TRUE) I.Insert(target) user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!", "You insert [tool] into [target]'s [parse_zone(target_zone)].") diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index caa6cc7a97..0de1683fbd 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -49,9 +49,8 @@ else if(!uses) to_chat(user, "[src] has already been used up.") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return - I.forceMove(src) storedorgan = I to_chat(user, "You insert the [I] into [src].") else if(istype(I, /obj/item/screwdriver)) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index d1699cb257..9308154c48 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -89,7 +89,7 @@ /obj/item/organ/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target) if(H == user && istype(H)) playsound(user,'sound/effects/singlebeat.ogg',40,1) - user.drop_item() + user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) else return ..() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 4fdda7a7bc..681dcb21cf 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -92,10 +92,9 @@ if(status == ORGAN_ORGANIC) var/obj/item/reagent_containers/food/snacks/S = prepare_eat() if(S) - H.drop_item() - H.put_in_active_hand(S) - S.attack(H, H) qdel(src) + if(H.put_in_active_hand(S)) + S.attack(H, H) else ..() diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index e817416d7e..2dddb95872 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -63,9 +63,8 @@ tool.desc = "A container for holding body parts." tool.cut_overlays() tool = tool.contents[1] - if(istype(tool, /obj/item/bodypart)) + if(istype(tool, /obj/item/bodypart) && user.temporarilyRemoveItemFromInventory(tool)) var/obj/item/bodypart/L = tool - user.drop_item() L.attach_limb(target) if(organ_rejection_dam) target.adjustToxLoss(organ_rejection_dam) diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 7be42b6e4d..0d97cb63c1 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -47,10 +47,9 @@ if(mybag) to_chat(user, "[src] already has a trashbag hooked!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(I, src)) return to_chat(user, "You hook the trashbag onto [src].") - I.loc = src mybag = I update_icon() else if(istype(I, /obj/item/janiupgrade))