mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-09 00:52:09 +00:00
This commit ports /tg/'s move refactor. The throwing system has been replaced entirely, removing the necessity of throw_at_fast and resolving multiple outstanding issues, such as crossbows being unusable. Spacedrifting has also been upgraded to function with the new throwing system. It is now it's own process. Tickcomp has been killed, and the config values have been adjusted to more or less match live Paradise. All mobs now share a common Bump() proc. There are only four mobtypes which do not, including humans and simple animals. With the exception of mob types that do not ever want to Bump() or be Bumped(), they should call the parent proc. Human movement slowdown has been moderately tweaked in how it stacks effects; It shouldn't be significantly different from a player perspective. Mobs will now spread fire if they bump into another mob. I don't want to set the world on fiiiire, I just want start a flame in your heart~ For player facing changes: Input delay has been reduced by roughly ~50ms for any direction keys, by advantage of a previously unknown flag on byond verbs which allow them to operate independently from the tick rate of the server. You may need to clear your interface.dmf file if you have a custom skin for this change to function.
149 lines
4.1 KiB
Plaintext
149 lines
4.1 KiB
Plaintext
/obj/item/weapon/twohanded/rcl
|
|
name = "rapid cable layer (RCL)"
|
|
desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables."
|
|
icon = 'icons/obj/tools.dmi'
|
|
icon_state = "rcl-0"
|
|
item_state = "rcl-0"
|
|
opacity = 0
|
|
force = 5 //Plastic is soft
|
|
throwforce = 5
|
|
throw_speed = 1
|
|
throw_range = 7
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
origin_tech = "engineering=4;materials=4"
|
|
var/max_amount = 90
|
|
var/active = 0
|
|
var/obj/structure/cable/last = null
|
|
var/obj/item/stack/cable_coil/loaded = null
|
|
|
|
/obj/item/weapon/twohanded/rcl/attackby(obj/item/weapon/W, mob/user)
|
|
if(istype(W, /obj/item/stack/cable_coil))
|
|
var/obj/item/stack/cable_coil/C = W
|
|
if(!loaded)
|
|
if(user.drop_item())
|
|
loaded = W
|
|
loaded.forceMove(src)
|
|
loaded.max_amount = max_amount //We store a lot.
|
|
else
|
|
to_chat(user, "<span class='warning'>[user.get_active_hand()] is stuck to your hand!</span>")
|
|
return
|
|
else
|
|
if(loaded.amount < max_amount)
|
|
var/amount = min(loaded.amount + C.amount, max_amount)
|
|
C.use(amount - loaded.amount)
|
|
loaded.amount = amount
|
|
else
|
|
return
|
|
update_icon()
|
|
to_chat(user, "<span class='notice'>You add the cables to the [src]. It now contains [loaded.amount].</span>")
|
|
else if(isscrewdriver(W))
|
|
if(!loaded)
|
|
return
|
|
to_chat(user, "<span class='notice'>You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.</span>")
|
|
while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
|
|
var/diff = loaded.amount % 30
|
|
if(diff)
|
|
loaded.use(diff)
|
|
new /obj/item/stack/cable_coil(user.loc, diff)
|
|
else
|
|
loaded.use(30)
|
|
new /obj/item/stack/cable_coil(user.loc, 30)
|
|
loaded.max_amount = initial(loaded.max_amount)
|
|
loaded.forceMove(user.loc)
|
|
user.put_in_hands(loaded)
|
|
loaded = null
|
|
update_icon()
|
|
else
|
|
..()
|
|
|
|
/obj/item/weapon/twohanded/rcl/examine(mob/user)
|
|
..()
|
|
if(loaded)
|
|
to_chat(user, "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>")
|
|
|
|
/obj/item/weapon/twohanded/rcl/Destroy()
|
|
QDEL_NULL(loaded)
|
|
last = null
|
|
active = 0
|
|
return ..()
|
|
|
|
/obj/item/weapon/twohanded/rcl/update_icon()
|
|
if(!loaded)
|
|
icon_state = "rcl-0"
|
|
item_state = "rcl-0"
|
|
return
|
|
switch(loaded.amount)
|
|
if(61 to INFINITY)
|
|
icon_state = "rcl-30"
|
|
item_state = "rcl"
|
|
if(31 to 60)
|
|
icon_state = "rcl-20"
|
|
item_state = "rcl"
|
|
if(1 to 30)
|
|
icon_state = "rcl-10"
|
|
item_state = "rcl"
|
|
else
|
|
icon_state = "rcl-0"
|
|
item_state = "rcl-0"
|
|
|
|
/obj/item/weapon/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
|
|
update_icon()
|
|
if(!loaded || !loaded.amount)
|
|
if(loud)
|
|
to_chat(user, "<span class='notice'>The last of the cables unreel from [src].</span>")
|
|
if(loaded)
|
|
qdel(loaded)
|
|
loaded = null
|
|
unwield(user)
|
|
active = wielded
|
|
return 1
|
|
return 0
|
|
|
|
/obj/item/weapon/twohanded/rcl/dropped(mob/wearer)
|
|
..()
|
|
active = 0
|
|
last = null
|
|
|
|
/obj/item/weapon/twohanded/rcl/attack_self(mob/user)
|
|
..()
|
|
active = wielded
|
|
if(!active)
|
|
last = null
|
|
else if(!last)
|
|
for(var/obj/structure/cable/C in get_turf(user))
|
|
if(C.d1 == 0 || C.d2 == 0)
|
|
last = C
|
|
break
|
|
|
|
/obj/item/weapon/twohanded/rcl/on_mob_move(direct, mob/user)
|
|
if(active)
|
|
trigger(user)
|
|
|
|
/obj/item/weapon/twohanded/rcl/proc/trigger(mob/user)
|
|
if(is_empty(user, 0))
|
|
to_chat(user, "<span class='warning'>\The [src] is empty!</span>")
|
|
return
|
|
if(last)
|
|
if(get_dist(last, user) == 1) //hacky, but it works
|
|
var/turf/T = get_turf(user)
|
|
if(!isturf(T) || T.intact || !T.can_have_cabling())
|
|
last = null
|
|
return
|
|
if(get_dir(last, user) == last.d2)
|
|
//Did we just walk backwards? Well, that's the one direction we CAN'T complete a stub.
|
|
last = null
|
|
return
|
|
loaded.cable_join(last, user)
|
|
if(is_empty(user))
|
|
return //If we've run out, display message and exit
|
|
else
|
|
last = null
|
|
last = loaded.place_turf(get_turf(loc), user, turn(user.dir, 180))
|
|
is_empty(user) //If we've run out, display message
|
|
|
|
/obj/item/weapon/twohanded/rcl/pre_loaded/New() //Comes preloaded with cable, for testing stuff
|
|
..()
|
|
loaded = new()
|
|
loaded.max_amount = max_amount
|
|
loaded.amount = max_amount
|
|
update_icon() |