mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
[MIRROR] some robot file splitting (#10643)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
a0d997d9f5
commit
8dbb9f68e9
@@ -59,3 +59,6 @@
|
||||
|
||||
/datum/matter_synth/cloth
|
||||
name = "Cloth Synthesizer"
|
||||
|
||||
/datum/matter_synth/beacon
|
||||
name = "Beacon Synthesizer"
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
|
||||
/obj/item/shield_projector/line/exploborg
|
||||
name = "expirmental shield projector"
|
||||
description_info = "This creates a shield in a straight line perpendicular to the direction where the user was facing when it was activated. \
|
||||
The shield allows projectiles to leave from inside but blocks projectiles from outside. Everything else can pass through the shield freely, \
|
||||
including other people and thrown objects. The shield also cannot block certain effects which take place over an area, such as flashbangs or explosions."
|
||||
shield_health = 90
|
||||
max_shield_health = 90
|
||||
shield_regen_amount = 25
|
||||
line_length = 7 // How long the line is. Recommended to be an odd number.
|
||||
offset_from_center = 2 // How far from the projector will the line's center be.
|
||||
|
||||
// To repair a single module
|
||||
/obj/item/self_repair_system
|
||||
name = "plating repair system"
|
||||
desc = "A nanite control system to repair damaged armour plating and wiring while not moving. Destroyed armour can't be restored."
|
||||
icon = 'icons/obj/robot_component.dmi'
|
||||
icon_state = "armor"
|
||||
var/repair_time = 25
|
||||
var/repair_amount = 2.5
|
||||
var/power_tick = 25
|
||||
var/disabled_icon = "armor"
|
||||
var/active_icon = "armor_broken"
|
||||
var/list/target_components = list("armour")
|
||||
var/repairing = FALSE
|
||||
flags = NOBLUDGEON
|
||||
|
||||
/obj/item/self_repair_system/attack_self(mob/user)
|
||||
if(repairing)
|
||||
return
|
||||
var/mob/living/silicon/robot/R = user
|
||||
var/destroyed_components = FALSE
|
||||
var/list/repairable_components = list()
|
||||
for(var/target_component in target_components)
|
||||
var/datum/robot_component/C = R.components[target_component]
|
||||
if(!C)
|
||||
continue
|
||||
if(istype(C.wrapped, /obj/item/broken_device))
|
||||
destroyed_components = TRUE
|
||||
else if (C.brute_damage != 0 || C.electronics_damage != 0)
|
||||
repairable_components += C
|
||||
if(!repairable_components.len && destroyed_components)
|
||||
to_chat(R, span_warning("Repair system initialization failed. Can't repair destroyed [target_components.len == 1 ? "[R.components[target_components[1]]]'s" : "component's"] plating or wiring."))
|
||||
return
|
||||
if(!repairable_components.len)
|
||||
to_chat(R, span_warning("No brute or burn damage detected [target_components.len == 1 ? "in [R.components[target_components[1]]]" : ""]."))
|
||||
return
|
||||
if(destroyed_components)
|
||||
to_chat(R, span_warning("WARNING! Destroyed modules detected. Those can not be repaired!"))
|
||||
icon_state = active_icon
|
||||
update_icon()
|
||||
repairing = TRUE
|
||||
for(var/datum/robot_component/C in repairable_components)
|
||||
to_chat(R, span_notice("Repair system initializated. Repairing plating and wiring of [C]."))
|
||||
src.self_repair(R, C, repair_time, repair_amount)
|
||||
repairing = FALSE
|
||||
icon_state = disabled_icon
|
||||
update_icon()
|
||||
|
||||
/obj/item/self_repair_system/proc/self_repair(mob/living/silicon/robot/R, datum/robot_component/C, var/tick_delay, var/heal_per_tick)
|
||||
if(!C || !R.cell)
|
||||
return
|
||||
if(C.brute_damage == 0 && C.electronics_damage == 0)
|
||||
to_chat(R, span_notice("Repair of [C] completed."))
|
||||
return
|
||||
if(!R.use_direct_power(power_tick, 500)) //We don't want to drain ourselves too far down during exploration
|
||||
to_chat(R, span_warning("Not enough power to initialize the repair system."))
|
||||
return
|
||||
if(do_after(R, tick_delay))
|
||||
if(!C)
|
||||
return
|
||||
C.brute_damage -= min(C.brute_damage, heal_per_tick)
|
||||
C.electronics_damage -= min(C.electronics_damage, heal_per_tick)
|
||||
R.updatehealth()
|
||||
src.self_repair(R, C, tick_delay, heal_per_tick)
|
||||
|
||||
// To repair multiple modules
|
||||
/obj/item/self_repair_system/advanced
|
||||
name = "self repair system"
|
||||
desc = "A nanite control system to repair damaged components while not moving. Destroyed components can't be restored."
|
||||
target_components = list("actuator", "radio", "power cell", "diagnosis unit", "camera", "comms", "armour")
|
||||
power_tick = 10
|
||||
repair_time = 15
|
||||
repair_amount = 3
|
||||
@@ -301,17 +301,6 @@
|
||||
enabled = FALSE
|
||||
icon_state = "scrub0"
|
||||
|
||||
/obj/item/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works.
|
||||
name = "disabler"
|
||||
desc = "A small and nonlethal gun produced by NT.."
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "ertgunstun"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
projectile_type = /obj/item/projectile/beam/disable
|
||||
charge_cost = 240 //Normal cost of a taser. It used to be 1000, but after some testing it was found that it would sap a borg's battery to quick
|
||||
recharge_time = 1 //Takes ten ticks to recharge a laser, so don't waste them all!
|
||||
//cell_type = null //Same cell as a taser until edits are made.
|
||||
|
||||
/obj/item/lightreplacer/dogborg
|
||||
name = "light replacer"
|
||||
desc = "A device to automatically replace lights. This version is capable to produce a few replacements using your internal matter reserves."
|
||||
@@ -558,7 +547,7 @@
|
||||
range = custom_range
|
||||
to_chat(user, span_notice("Scanner will now look up to [range] tile(s) away."))
|
||||
|
||||
//CHOMPEDIT Enable
|
||||
//CHOMPEnable Start
|
||||
/obj/item/robot_tongue/examine(user)
|
||||
. = ..()
|
||||
if(Adjacent(user))
|
||||
@@ -566,157 +555,4 @@
|
||||
. += span_notice("[src] is wet. Just like it should be.")
|
||||
if(water.energy < 5)
|
||||
. += span_notice("[src] is dry.")
|
||||
//CHOMPEDIT Enable
|
||||
|
||||
/obj/item/shield_projector/line/exploborg
|
||||
name = "expirmental shield projector"
|
||||
description_info = "This creates a shield in a straight line perpendicular to the direction where the user was facing when it was activated. \
|
||||
The shield allows projectiles to leave from inside but blocks projectiles from outside. Everything else can pass through the shield freely, \
|
||||
including other people and thrown objects. The shield also cannot block certain effects which take place over an area, such as flashbangs or explosions."
|
||||
shield_health = 90
|
||||
max_shield_health = 90
|
||||
shield_regen_amount = 25
|
||||
line_length = 7 // How long the line is. Recommended to be an odd number.
|
||||
offset_from_center = 2 // How far from the projector will the line's center be.
|
||||
|
||||
// To repair a single module
|
||||
/obj/item/self_repair_system
|
||||
name = "plating repair system"
|
||||
desc = "A nanite control system to repair damaged armour plating and wiring while not moving. Destroyed armour can't be restored."
|
||||
icon = 'icons/obj/robot_component.dmi'
|
||||
icon_state = "armor"
|
||||
var/repair_time = 25
|
||||
var/repair_amount = 2.5
|
||||
var/power_tick = 25
|
||||
var/disabled_icon = "armor"
|
||||
var/active_icon = "armor_broken"
|
||||
var/list/target_components = list("armour")
|
||||
var/repairing = FALSE
|
||||
|
||||
/obj/item/self_repair_system/New()
|
||||
..()
|
||||
flags |= NOBLUDGEON
|
||||
|
||||
/obj/item/self_repair_system/attack_self(mob/user)
|
||||
if(repairing)
|
||||
return
|
||||
var/mob/living/silicon/robot/R = user
|
||||
var/destroyed_components = FALSE
|
||||
var/list/repairable_components = list()
|
||||
for(var/target_component in target_components)
|
||||
var/datum/robot_component/C = R.components[target_component]
|
||||
if(!C)
|
||||
continue
|
||||
if(istype(C.wrapped, /obj/item/broken_device))
|
||||
destroyed_components = TRUE
|
||||
else if (C.brute_damage != 0 || C.electronics_damage != 0)
|
||||
repairable_components += C
|
||||
if(!repairable_components.len && destroyed_components)
|
||||
to_chat(R, span_warning("Repair system initialization failed. Can't repair destroyed [target_components.len == 1 ? "[R.components[target_components[1]]]'s" : "component's"] plating or wiring."))
|
||||
return
|
||||
if(!repairable_components.len)
|
||||
to_chat(R, span_warning("No brute or burn damage detected [target_components.len == 1 ? "in [R.components[target_components[1]]]" : ""]."))
|
||||
return
|
||||
if(destroyed_components)
|
||||
to_chat(R, span_warning("WARNING! Destroyed modules detected. Those can not be repaired!"))
|
||||
icon_state = active_icon
|
||||
update_icon()
|
||||
repairing = TRUE
|
||||
for(var/datum/robot_component/C in repairable_components)
|
||||
to_chat(R, span_notice("Repair system initializated. Repairing plating and wiring of [C]."))
|
||||
src.self_repair(R, C, repair_time, repair_amount)
|
||||
repairing = FALSE
|
||||
icon_state = disabled_icon
|
||||
update_icon()
|
||||
|
||||
/obj/item/self_repair_system/proc/self_repair(mob/living/silicon/robot/R, datum/robot_component/C, var/tick_delay, var/heal_per_tick)
|
||||
if(!C || !R.cell)
|
||||
return
|
||||
if(C.brute_damage == 0 && C.electronics_damage == 0)
|
||||
to_chat(R, span_notice("Repair of [C] completed."))
|
||||
return
|
||||
if(!R.use_direct_power(power_tick, 500)) //We don't want to drain ourselves too far down during exploration
|
||||
to_chat(R, span_warning("Not enough power to initialize the repair system."))
|
||||
return
|
||||
if(do_after(R, tick_delay))
|
||||
if(!C)
|
||||
return
|
||||
C.brute_damage -= min(C.brute_damage, heal_per_tick)
|
||||
C.electronics_damage -= min(C.electronics_damage, heal_per_tick)
|
||||
R.updatehealth()
|
||||
src.self_repair(R, C, tick_delay, heal_per_tick)
|
||||
|
||||
// To repair multiple modules
|
||||
/obj/item/self_repair_system/advanced
|
||||
name = "self repair system"
|
||||
desc = "A nanite control system to repair damaged components while not moving. Destroyed components can't be restored."
|
||||
target_components = list("actuator", "radio", "power cell", "diagnosis unit", "camera", "comms", "armour")
|
||||
power_tick = 10
|
||||
repair_time = 15
|
||||
repair_amount = 3
|
||||
|
||||
// Robot Weapons
|
||||
/obj/item/gun/energy/robotic/flare
|
||||
name = "flare gun"
|
||||
desc = "A flare-gun"
|
||||
projectile_type = /obj/item/projectile/energy/flash/flare
|
||||
fire_sound = 'sound/weapons/tablehit1.ogg'
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "taser"
|
||||
charge_cost = 480
|
||||
borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_TASER
|
||||
|
||||
/obj/item/gun/energy/robotic/smallmedigun
|
||||
name = "borg directed restoration system"
|
||||
desc = "An adapted version of the BL-3 'Phoenix, for expiremental useage in borgs."
|
||||
projectile_type = /obj/item/projectile/beam/medical_cell/borg
|
||||
accept_cell_type = /obj/item/cell/device
|
||||
cell_type = /obj/item/cell/device/weapon
|
||||
charge_cost = 600
|
||||
fire_delay = 6
|
||||
force = 5
|
||||
icon_state = "medbeam"
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
accuracy = 100
|
||||
fire_sound = 'sound/weapons/eluger.ogg'
|
||||
self_recharge = 1
|
||||
use_external_power = 1
|
||||
|
||||
/obj/item/projectile/beam/medical_cell/borg
|
||||
range = 4
|
||||
|
||||
/obj/item/projectile/beam/medical_cell/borg/on_hit(var/mob/living/carbon/human/target)
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
if(target.stat != DEAD)
|
||||
target.adjustBruteLoss(-3.75)
|
||||
target.adjustFireLoss(-3.75)
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/item/melee/robotic/blade/explotailspear
|
||||
name = "energy tail"
|
||||
desc = "A glowing tail spear with a moderate range. It appears to be extremely sharp."
|
||||
force = 45
|
||||
armor_penetration = 25 //30 to try and make it not useless against armored mobs but not fully nullify it.
|
||||
reach = 3
|
||||
projectile_parry_chance = 15.
|
||||
|
||||
/obj/item/melee/robotic/jaws/big/explojaws
|
||||
name = "explo jaws"
|
||||
desc = "Highly lethal jaws for close range combat."
|
||||
force = 60
|
||||
armor_penetration = 25 //To try and make it not useless against armored mobs but not fully nullify it
|
||||
projectile_parry_chance = 15
|
||||
|
||||
/obj/item/gun/energy/robotic/phasegun
|
||||
name = "EW26 Artemis Mounted"
|
||||
desc = "The RayZar EW26 Artemis, also known as the 'phase carbine', is a downsized energy-based weapon specifically designed for use against wildlife. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "phasecarbine"
|
||||
charge_cost = 160
|
||||
recharge_time = 16
|
||||
projectile_type = /obj/item/projectile/energy/phase
|
||||
use_external_power = 1
|
||||
self_recharge = 1
|
||||
borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_LASER
|
||||
// CHOMPEnable End
|
||||
@@ -1,52 +0,0 @@
|
||||
/*TEST*/
|
||||
/******/
|
||||
|
||||
/obj/item/dogborg/pounce_module
|
||||
name = "pounce module"
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "pounce"
|
||||
desc = "Routine to allow pouncing"
|
||||
throwforce = 0 //This shouldn't be thrown in the first place.
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
/obj/item/dogborg/pounce_module/New()
|
||||
..()
|
||||
flags |= NOBLUDGEON //No more attack messages
|
||||
|
||||
/obj/item/dogborg/pounce_module/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/dogborg/pounce_module/afterattack(atom/target, mob/user as mob, proximity)
|
||||
if(proximity && ishuman(target))
|
||||
user.visible_message(span_notice("\the [user] pounces at \the [target]'s face!"), span_notice("You pounce at \the [target]!"))
|
||||
var/mob/living/L = target
|
||||
L.Weaken(10)
|
||||
user.loc = target.loc
|
||||
return
|
||||
return
|
||||
|
||||
/* Not needed anymore because we have removed boozeborg from the _vr file that Yawn wanted to put it in and restored the _ch file we had for this found in /code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm.
|
||||
/mob/living/silicon/robot/proc/reskin_booze()
|
||||
set name = "Change Drink Color"
|
||||
set category = "Abilities.Silicon" //ChompEDIT - TGPanel
|
||||
set desc = "Choose the color of drink displayed inside you."
|
||||
|
||||
var/mob/M = usr
|
||||
var/list/options = list()
|
||||
options["Beer"] = "Beer Buddy"
|
||||
options["Curacao"] = "Brilliant Blue"
|
||||
options["Coffee"] = "Caffine Dispenser"
|
||||
options["Space Mountain Wind"] = "Gamer Juice Maker"
|
||||
options["Whiskey Soda"] = "Liqour Licker"
|
||||
options["Grape Soda"] = "The Grapist"
|
||||
options["Demon's Blood"] = "Vampire's Aid"
|
||||
options["Slav Vodka"] = "Vodka Komrade"
|
||||
var/choice = input(M,"Choose your drink!") in options
|
||||
if(src && choice && !M.stat && in_range(M,src))
|
||||
icontype = options[choice]
|
||||
var/active_sound = 'sound/effects/bubbles.ogg'
|
||||
playsound(src.loc, "[active_sound]", 100, 0, 4)
|
||||
to_chat(M, "Your Tank now displays [choice]. Drink up and enjoy!")
|
||||
updateicon()
|
||||
return 1
|
||||
*/
|
||||
@@ -735,200 +735,4 @@
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
|
||||
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
|
||||
name = "Brig-Belly"
|
||||
desc = "A mounted portable-brig that holds criminals for processing or 'processing'."
|
||||
icon_state = "sleeperb"
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
stabilizer = TRUE
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor //Janihound gut.
|
||||
name = "Garbage Processor"
|
||||
desc = "A mounted garbage compactor unit with fuel processor, capable of processing any kind of contaminant."
|
||||
icon_state = "compactor"
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
compactor = TRUE
|
||||
recycles = TRUE
|
||||
max_item_count = 25
|
||||
stabilizer = FALSE
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/analyzer //sci-borg gut.
|
||||
name = "Digestive Analyzer"
|
||||
desc = "A mounted destructive analyzer unit with fuel processor, for 'deep scientific analysis'."
|
||||
icon_state = "analyzer"
|
||||
max_item_count = 10
|
||||
startdrain = 100
|
||||
analyzer = TRUE
|
||||
recycles = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/decompiler
|
||||
name = "Matter Decompiler"
|
||||
desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone."
|
||||
icon_state = "decompiler"
|
||||
max_item_count = 10
|
||||
decompiler = TRUE
|
||||
recycles = TRUE
|
||||
/*
|
||||
/obj/item/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing.
|
||||
name = "Cargo Belly"
|
||||
desc = "A mounted cargo bay unit for tagged deliveries."
|
||||
icon_state = "decompiler"
|
||||
max_item_count = 20
|
||||
delivery = TRUE
|
||||
recycles = FALSE
|
||||
*/
|
||||
/obj/item/dogborg/sleeper/compactor/supply //Miner borg belly
|
||||
name = "Supply Storage"
|
||||
desc = "A mounted survival unit with fuel processor, helpful with both deliveries and assisting injured miners."
|
||||
icon_state = "sleeperc"
|
||||
injection_chems = list(REAGENT_ID_GLUCOSE,REAGENT_ID_INAPROVALINE,REAGENT_ID_TRICORDRAZINE)
|
||||
max_item_count = 20
|
||||
ore_storage = TRUE
|
||||
var/list/stored_ore = list(
|
||||
ORE_SAND = 0,
|
||||
ORE_HEMATITE = 0,
|
||||
ORE_CARBON = 0,
|
||||
ORE_COPPER = 0,
|
||||
ORE_TIN = 0,
|
||||
ORE_VOPAL = 0,
|
||||
ORE_PAINITE = 0,
|
||||
ORE_QUARTZ = 0,
|
||||
ORE_BAUXITE = 0,
|
||||
ORE_PHORON = 0,
|
||||
ORE_SILVER = 0,
|
||||
ORE_GOLD = 0,
|
||||
ORE_MARBLE = 0,
|
||||
ORE_URANIUM = 0,
|
||||
ORE_DIAMOND = 0,
|
||||
ORE_PLATINUM = 0,
|
||||
ORE_LEAD = 0,
|
||||
ORE_MHYDROGEN = 0,
|
||||
ORE_VERDANTIUM = 0,
|
||||
ORE_RUTILE = 0)
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/supply/Entered(atom/movable/thing, atom/OldLoc)
|
||||
. = ..()
|
||||
if(istype(thing, /obj/item/ore))
|
||||
var/obj/item/ore/ore = thing
|
||||
stored_ore[ore.material]++
|
||||
current_capacity++
|
||||
qdel(ore)
|
||||
|
||||
/obj/structure/ore_box/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/dogborg/sleeper/compactor/supply))
|
||||
var/obj/item/dogborg/sleeper/compactor/supply/S = W
|
||||
for(var/ore in S.stored_ore)
|
||||
if(S.stored_ore[ore] > 0)
|
||||
var/ore_amount = S.stored_ore[ore] // How many ores does the satchel have?
|
||||
stored_ore[ore] += ore_amount // Add the ore to the machine.
|
||||
S.stored_ore[ore] = 0 // Set the value of the ore in the satchel to 0.
|
||||
S.current_capacity = 0 // Set the amount of ore in the satchel to 0.
|
||||
to_chat(user, span_notice("You empty the satchel into the box."))
|
||||
return
|
||||
..() //CHOMPEdit End
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/brewer
|
||||
name = "Brew Belly"
|
||||
desc = "A mounted drunk tank unit with fuel processor, for putting away particularly rowdy patrons."
|
||||
icon_state = "brewer"
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
max_item_count = 10
|
||||
recycles = FALSE
|
||||
stabilizer = TRUE
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/generic
|
||||
name = "Internal Cache"
|
||||
desc = "An internal storage of no particularly specific purpose.."
|
||||
icon_state = "sleeperd"
|
||||
max_item_count = 10
|
||||
recycles = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem) //CHOMP Addition Start
|
||||
if(patient && patient.reagents)
|
||||
if((chem in injection_chems) + REAGENT_ID_INAPROVALINE)
|
||||
if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it.
|
||||
to_chat(hound, span_notice("You don't have enough power to synthesize fluids."))
|
||||
return
|
||||
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
|
||||
to_chat(hound, span_notice("Your stomach is currently too full of fluids to secrete more fluids of this kind."))
|
||||
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you
|
||||
patient.reagents.add_reagent(chem, inject_amount)
|
||||
drain(100) //-100 charge per injection
|
||||
var/units = round(patient.reagents.get_reagent_amount(chem))
|
||||
to_chat(hound, span_notice("Injecting [units] unit\s into occupant.")) //If they were immersed, the reagents wouldn't leave with them.
|
||||
|
||||
//CHOMP Addition end
|
||||
|
||||
/obj/item/dogborg/sleeper/K9/ert
|
||||
name = "Emergency Storage"
|
||||
desc = "A mounted 'emergency containment cell'."
|
||||
icon_state = "sleeperert"
|
||||
injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_TRAMADOL) // short list
|
||||
|
||||
/obj/item/dogborg/sleeper/trauma //Trauma borg belly
|
||||
name = "Recovery Belly"
|
||||
desc = "A downgraded model of the sleeper belly, intended primarily for post-surgery recovery."
|
||||
icon_state = "sleeper"
|
||||
injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_DEXALIN, REAGENT_ID_TRICORDRAZINE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_OXYCODONE)
|
||||
|
||||
/obj/item/dogborg/sleeper/lost
|
||||
name = "Multipurpose Belly"
|
||||
desc = "A multipurpose belly, capable of functioning as both sleeper and processor."
|
||||
icon_state = "sleeperlost"
|
||||
injection_chems = list(REAGENT_ID_TRICORDRAZINE, REAGENT_ID_BICARIDINE, REAGENT_ID_DEXALIN, REAGENT_ID_ANTITOXIN, REAGENT_ID_TRAMADOL, REAGENT_ID_SPACEACILLIN)
|
||||
compactor = TRUE
|
||||
max_item_count = 25
|
||||
stabilizer = TRUE
|
||||
medsensor = TRUE
|
||||
|
||||
/obj/item/dogborg/sleeper/syndie
|
||||
name = "Combat Triage Belly"
|
||||
desc = "A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves. This one is for more extreme combat scenarios."
|
||||
icon_state = "sleepersyndiemed"
|
||||
injection_chems = list(REAGENT_ID_HEALINGNANITES, REAGENT_ID_HYPERZINE, REAGENT_ID_TRAMADOL, REAGENT_ID_OXYCODONE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_PERIDAXON, REAGENT_ID_OSTEODAXON, REAGENT_ID_MYELAMINE, REAGENT_ID_SYNTHBLOOD)
|
||||
digest_multiplier = 2
|
||||
|
||||
/obj/item/dogborg/sleeper/K9/syndie
|
||||
name = "Cell-Belly"
|
||||
desc = "A mounted portable cell that holds anyone you wish for processing or 'processing'."
|
||||
icon_state = "sleepersyndiebrig"
|
||||
digest_multiplier = 3
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/syndie
|
||||
name = "Advanced Matter Decompiler"
|
||||
desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone in your way."
|
||||
icon_state = "sleepersyndieeng"
|
||||
max_item_count = 35
|
||||
digest_multiplier = 3
|
||||
|
||||
/obj/item/dogborg/sleeper/command //Command borg belly
|
||||
name = "Bluespace Filing Belly"
|
||||
desc = "A mounted bluespace storage unit for carrying paperwork"
|
||||
icon_state = "sleeperd"
|
||||
injection_chems = null
|
||||
compactor = TRUE
|
||||
recycles = FALSE
|
||||
max_item_count = 25
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/honkborg
|
||||
name = "Jiggles Von Hungertron"
|
||||
desc = "You've heard of Giggles Von Honkerton for the back, now get ready for Jiggles Von Hungertron for the front."
|
||||
icon_state = "clowngut"
|
||||
recycles = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/exploration
|
||||
name = "Store-Belly"
|
||||
desc = "Equipment for a ExploreHound unit. A mounted portable-storage device that holds supplies/person."
|
||||
icon_state = "sleeperlost"
|
||||
injection_chems = list(REAGENT_ID_INAPROVALINE) // Only to stabilize during extractions
|
||||
compactor = TRUE
|
||||
max_item_count = 4
|
||||
medsensor = FALSE
|
||||
recycles = TRUE
|
||||
|
||||
#undef SLEEPER_INJECT_COST
|
||||
@@ -0,0 +1,198 @@
|
||||
/obj/item/dogborg/sleeper/K9 //The K9 portabrig
|
||||
name = "Brig-Belly"
|
||||
desc = "A mounted portable-brig that holds criminals for processing or 'processing'."
|
||||
icon_state = "sleeperb"
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
stabilizer = TRUE
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor //Janihound gut.
|
||||
name = "Garbage Processor"
|
||||
desc = "A mounted garbage compactor unit with fuel processor, capable of processing any kind of contaminant."
|
||||
icon_state = "compactor"
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
compactor = TRUE
|
||||
recycles = TRUE
|
||||
max_item_count = 25
|
||||
stabilizer = FALSE
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/analyzer //sci-borg gut.
|
||||
name = "Digestive Analyzer"
|
||||
desc = "A mounted destructive analyzer unit with fuel processor, for 'deep scientific analysis'."
|
||||
icon_state = "analyzer"
|
||||
max_item_count = 10
|
||||
startdrain = 100
|
||||
analyzer = TRUE
|
||||
recycles = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/decompiler
|
||||
name = "Matter Decompiler"
|
||||
desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone."
|
||||
icon_state = "decompiler"
|
||||
max_item_count = 10
|
||||
decompiler = TRUE
|
||||
recycles = TRUE
|
||||
/*
|
||||
/obj/item/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing.
|
||||
name = "Cargo Belly"
|
||||
desc = "A mounted cargo bay unit for tagged deliveries."
|
||||
icon_state = "decompiler"
|
||||
max_item_count = 20
|
||||
delivery = TRUE
|
||||
recycles = FALSE
|
||||
*/
|
||||
|
||||
//CHOMPEdit Start
|
||||
/obj/item/dogborg/sleeper/compactor/supply //Miner borg belly
|
||||
name = "Supply Storage"
|
||||
desc = "A mounted survival unit with fuel processor, helpful with both deliveries and assisting injured miners."
|
||||
icon_state = "sleeperc"
|
||||
injection_chems = list(REAGENT_ID_GLUCOSE,REAGENT_ID_INAPROVALINE,REAGENT_ID_TRICORDRAZINE)
|
||||
max_item_count = 20
|
||||
ore_storage = TRUE
|
||||
var/list/stored_ore = list(
|
||||
ORE_SAND = 0,
|
||||
ORE_HEMATITE = 0,
|
||||
ORE_CARBON = 0,
|
||||
ORE_COPPER = 0,
|
||||
ORE_TIN = 0,
|
||||
ORE_VOPAL = 0,
|
||||
ORE_PAINITE = 0,
|
||||
ORE_QUARTZ = 0,
|
||||
ORE_BAUXITE = 0,
|
||||
ORE_PHORON = 0,
|
||||
ORE_SILVER = 0,
|
||||
ORE_GOLD = 0,
|
||||
ORE_MARBLE = 0,
|
||||
ORE_URANIUM = 0,
|
||||
ORE_DIAMOND = 0,
|
||||
ORE_PLATINUM = 0,
|
||||
ORE_LEAD = 0,
|
||||
ORE_MHYDROGEN = 0,
|
||||
ORE_VERDANTIUM = 0,
|
||||
ORE_RUTILE = 0)
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/supply/Entered(atom/movable/thing, atom/OldLoc)
|
||||
. = ..()
|
||||
if(istype(thing, /obj/item/ore))
|
||||
var/obj/item/ore/ore = thing
|
||||
stored_ore[ore.material]++
|
||||
current_capacity++
|
||||
qdel(ore)
|
||||
|
||||
/obj/structure/ore_box/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/dogborg/sleeper/compactor/supply))
|
||||
var/obj/item/dogborg/sleeper/compactor/supply/S = W
|
||||
for(var/ore in S.stored_ore)
|
||||
if(S.stored_ore[ore] > 0)
|
||||
var/ore_amount = S.stored_ore[ore] // How many ores does the satchel have?
|
||||
stored_ore[ore] += ore_amount // Add the ore to the machine.
|
||||
S.stored_ore[ore] = 0 // Set the value of the ore in the satchel to 0.
|
||||
S.current_capacity = 0 // Set the amount of ore in the satchel to 0.
|
||||
to_chat(user, span_notice("You empty the satchel into the box."))
|
||||
return
|
||||
..()
|
||||
//CHOMPEdit End
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/brewer
|
||||
name = "Brew Belly"
|
||||
desc = "A mounted drunk tank unit with fuel processor, for putting away particularly rowdy patrons."
|
||||
icon_state = "brewer"
|
||||
injection_chems = null //So they don't have all the same chems as the medihound!
|
||||
max_item_count = 10
|
||||
recycles = FALSE
|
||||
stabilizer = TRUE
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/generic
|
||||
name = "Internal Cache"
|
||||
desc = "An internal storage of no particularly specific purpose.."
|
||||
icon_state = "sleeperd"
|
||||
max_item_count = 10
|
||||
recycles = FALSE
|
||||
|
||||
// CHOMPAdd Start
|
||||
/obj/item/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem)
|
||||
if(patient && patient.reagents)
|
||||
if((chem in injection_chems) + REAGENT_ID_INAPROVALINE)
|
||||
if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it.
|
||||
to_chat(hound, span_notice("You don't have enough power to synthesize fluids."))
|
||||
return
|
||||
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
|
||||
to_chat(hound, span_notice("Your stomach is currently too full of fluids to secrete more fluids of this kind."))
|
||||
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you
|
||||
patient.reagents.add_reagent(chem, inject_amount)
|
||||
drain(100) //-100 charge per injection
|
||||
var/units = round(patient.reagents.get_reagent_amount(chem))
|
||||
to_chat(hound, span_notice("Injecting [units] unit\s into occupant.")) //If they were immersed, the reagents wouldn't leave with them.
|
||||
// CHOMPAdd End
|
||||
|
||||
/obj/item/dogborg/sleeper/K9/ert
|
||||
name = "Emergency Storage"
|
||||
desc = "A mounted 'emergency containment cell'."
|
||||
icon_state = "sleeperert"
|
||||
injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_TRAMADOL) // short list
|
||||
|
||||
/obj/item/dogborg/sleeper/trauma //Trauma borg belly
|
||||
name = "Recovery Belly"
|
||||
desc = "A downgraded model of the sleeper belly, intended primarily for post-surgery recovery."
|
||||
icon_state = "sleeper"
|
||||
injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_DEXALIN, REAGENT_ID_TRICORDRAZINE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_OXYCODONE)
|
||||
|
||||
/obj/item/dogborg/sleeper/lost
|
||||
name = "Multipurpose Belly"
|
||||
desc = "A multipurpose belly, capable of functioning as both sleeper and processor."
|
||||
icon_state = "sleeperlost"
|
||||
injection_chems = list(REAGENT_ID_TRICORDRAZINE, REAGENT_ID_BICARIDINE, REAGENT_ID_DEXALIN, REAGENT_ID_ANTITOXIN, REAGENT_ID_TRAMADOL, REAGENT_ID_SPACEACILLIN)
|
||||
compactor = TRUE
|
||||
max_item_count = 25
|
||||
stabilizer = TRUE
|
||||
medsensor = TRUE
|
||||
|
||||
/obj/item/dogborg/sleeper/syndie
|
||||
name = "Combat Triage Belly"
|
||||
desc = "A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves. This one is for more extreme combat scenarios."
|
||||
icon_state = "sleepersyndiemed"
|
||||
injection_chems = list(REAGENT_ID_HEALINGNANITES, REAGENT_ID_HYPERZINE, REAGENT_ID_TRAMADOL, REAGENT_ID_OXYCODONE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_PERIDAXON, REAGENT_ID_OSTEODAXON, REAGENT_ID_MYELAMINE, REAGENT_ID_SYNTHBLOOD)
|
||||
digest_multiplier = 2
|
||||
|
||||
/obj/item/dogborg/sleeper/K9/syndie
|
||||
name = "Cell-Belly"
|
||||
desc = "A mounted portable cell that holds anyone you wish for processing or 'processing'."
|
||||
icon_state = "sleepersyndiebrig"
|
||||
digest_multiplier = 3
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/syndie
|
||||
name = "Advanced Matter Decompiler"
|
||||
desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone in your way."
|
||||
icon_state = "sleepersyndieeng"
|
||||
max_item_count = 35
|
||||
digest_multiplier = 3
|
||||
|
||||
/obj/item/dogborg/sleeper/command //Command borg belly
|
||||
name = "Bluespace Filing Belly"
|
||||
desc = "A mounted bluespace storage unit for carrying paperwork"
|
||||
icon_state = "sleeperd"
|
||||
injection_chems = null
|
||||
compactor = TRUE
|
||||
recycles = FALSE
|
||||
max_item_count = 25
|
||||
medsensor = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/honkborg
|
||||
name = "Jiggles Von Hungertron"
|
||||
desc = "You've heard of Giggles Von Honkerton for the back, now get ready for Jiggles Von Hungertron for the front."
|
||||
icon_state = "clowngut"
|
||||
recycles = FALSE
|
||||
|
||||
/obj/item/dogborg/sleeper/exploration
|
||||
name = "Store-Belly"
|
||||
desc = "Equipment for a ExploreHound unit. A mounted portable-storage device that holds supplies/person."
|
||||
icon_state = "sleeperlost"
|
||||
injection_chems = list(REAGENT_ID_INAPROVALINE) // Only to stabilize during extractions
|
||||
compactor = TRUE
|
||||
max_item_count = 4
|
||||
medsensor = FALSE
|
||||
recycles = TRUE
|
||||
76
code/modules/mob/living/silicon/robot/dogborg/dog_weapons.dm
Normal file
76
code/modules/mob/living/silicon/robot/dogborg/dog_weapons.dm
Normal file
@@ -0,0 +1,76 @@
|
||||
// Robot Weapons
|
||||
/obj/item/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works.
|
||||
name = "disabler"
|
||||
desc = "A small and nonlethal gun produced by NT.."
|
||||
icon = 'icons/mob/dogborg_vr.dmi'
|
||||
icon_state = "ertgunstun"
|
||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||
projectile_type = /obj/item/projectile/beam/disable
|
||||
charge_cost = 240 //Normal cost of a taser. It used to be 1000, but after some testing it was found that it would sap a borg's battery to quick
|
||||
recharge_time = 1 //Takes ten ticks to recharge a laser, so don't waste them all!
|
||||
//cell_type = null //Same cell as a taser until edits are made.
|
||||
|
||||
/obj/item/gun/energy/robotic/flare
|
||||
name = "flare gun"
|
||||
desc = "A flare-gun"
|
||||
projectile_type = /obj/item/projectile/energy/flash/flare
|
||||
fire_sound = 'sound/weapons/tablehit1.ogg'
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "taser"
|
||||
charge_cost = 480
|
||||
borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_TASER
|
||||
|
||||
/obj/item/gun/energy/robotic/smallmedigun
|
||||
name = "borg directed restoration system"
|
||||
desc = "An adapted version of the BL-3 'Phoenix, for expiremental useage in borgs."
|
||||
projectile_type = /obj/item/projectile/beam/medical_cell/borg
|
||||
accept_cell_type = /obj/item/cell/device
|
||||
cell_type = /obj/item/cell/device/weapon
|
||||
charge_cost = 600
|
||||
fire_delay = 6
|
||||
force = 5
|
||||
icon_state = "medbeam"
|
||||
icon = 'icons/obj/gun_vr.dmi'
|
||||
accuracy = 100
|
||||
fire_sound = 'sound/weapons/eluger.ogg'
|
||||
self_recharge = 1
|
||||
use_external_power = 1
|
||||
|
||||
/obj/item/projectile/beam/medical_cell/borg
|
||||
range = 4
|
||||
|
||||
/obj/item/projectile/beam/medical_cell/borg/on_hit(var/mob/living/carbon/human/target)
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
if(target.stat != DEAD)
|
||||
target.adjustBruteLoss(-3.75)
|
||||
target.adjustFireLoss(-3.75)
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/item/melee/robotic/blade/explotailspear
|
||||
name = "energy tail"
|
||||
desc = "A glowing tail spear with a moderate range. It appears to be extremely sharp."
|
||||
force = 45
|
||||
armor_penetration = 25 //30 to try and make it not useless against armored mobs but not fully nullify it.
|
||||
reach = 3
|
||||
projectile_parry_chance = 15.
|
||||
|
||||
/obj/item/melee/robotic/jaws/big/explojaws
|
||||
name = "explo jaws"
|
||||
desc = "Highly lethal jaws for close range combat."
|
||||
force = 60
|
||||
armor_penetration = 25 //To try and make it not useless against armored mobs but not fully nullify it
|
||||
projectile_parry_chance = 15
|
||||
|
||||
/obj/item/gun/energy/robotic/phasegun
|
||||
name = "EW26 Artemis Mounted"
|
||||
desc = "The RayZar EW26 Artemis, also known as the 'phase carbine', is a downsized energy-based weapon specifically designed for use against wildlife. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "phasecarbine"
|
||||
charge_cost = 160
|
||||
recharge_time = 16
|
||||
projectile_type = /obj/item/projectile/energy/phase
|
||||
use_external_power = 1
|
||||
self_recharge = 1
|
||||
borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_LASER
|
||||
@@ -775,6 +775,15 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/vac_attachment(src) //CHOMPAdd
|
||||
src.emag += new /obj/item/kinetic_crusher/machete/dagger(src)
|
||||
|
||||
var/datum/matter_synth/beacon = new /datum/matter_synth/beacon(10000)
|
||||
synths += beacon
|
||||
|
||||
var/obj/item/stack/marker_beacon/MB = new /obj/item/stack/marker_beacon(src)
|
||||
MB.uses_charge = 1
|
||||
MB.charge_costs = list(500)
|
||||
MB.synths = list(beacon)
|
||||
src.modules += MB
|
||||
|
||||
src.modules += new /obj/item/dogborg/sleeper/compactor/supply(src)
|
||||
src.emag += new /obj/item/dogborg/pounce(src)
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ export const ChemDispenserSettings = (props) => {
|
||||
value={amount}
|
||||
minValue={1}
|
||||
maxValue={120}
|
||||
onDrag={(e, value) =>
|
||||
onChange={(e, value) =>
|
||||
act('amount', {
|
||||
amount: value,
|
||||
})
|
||||
|
||||
@@ -31,7 +31,7 @@ export const SpriteSection = (props: {
|
||||
scrollable
|
||||
width="30%"
|
||||
buttons={
|
||||
<Stack>
|
||||
<Stack g={0.2}>
|
||||
<Stack.Item>
|
||||
<Button.Checkbox
|
||||
checked={includeDefault}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { KeyboardEvent } from 'react';
|
||||
import { type KeyboardEvent, useRef, useState } from 'react';
|
||||
import { useBackend } from 'tgui/backend';
|
||||
import { Modal } from 'tgui-core/components';
|
||||
import {
|
||||
@@ -120,19 +120,26 @@ export const ComplexModal = (props) => {
|
||||
if (bodyOverrides[id]) {
|
||||
modalBody = bodyOverrides[id](modal);
|
||||
} else if (type === 'input') {
|
||||
let curValue = modal.value;
|
||||
const lastValue = useRef(modal.value);
|
||||
const [curValue, setCurValue] = useState(modal.value);
|
||||
|
||||
if (lastValue.current !== modal.value) {
|
||||
lastValue.current = modal.value;
|
||||
setCurValue(modal.value);
|
||||
}
|
||||
|
||||
modalOnEnter = (e) => modalAnswer(id, curValue, {});
|
||||
modalBody = (
|
||||
<Input
|
||||
key={id}
|
||||
value={modal.value}
|
||||
value={curValue}
|
||||
placeholder="ENTER to submit"
|
||||
width="100%"
|
||||
my="0.5rem"
|
||||
autoFocus
|
||||
autoSelect
|
||||
onChange={(val) => {
|
||||
curValue = val;
|
||||
setCurValue(val);
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -3420,9 +3420,11 @@
|
||||
#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot_ui.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\robot_ui_module.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_yw.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_defense_modules.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_types.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\dogborg\dog_weapons.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
|
||||
|
||||
Reference in New Issue
Block a user