mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
Port /tg/ move manager, drift and jetpack components. (#27698)
* Port /tg/ move manager, drift and jetpack components. * don't add go through newtonian movement if not moved to a turf * various cleans for blood drifts and mob speed * fix slow meteors * why on fuck's earth aren't speedbikes vehicles * style lint * also wtf * okay i'm an idiot * fix meaty ore speed and blood decal double stepping * fix not unbuckling pulled object occupants * don't bother dealing with immovable rods just yet * exclude bubblegum and vetus from move manager for now * fix issues related to null weightless blood icons * reset blood icon state properly * fuck it, we'll deal with mobs when basic mobs happen * break infinite loop in decal splat
This commit is contained in:
@@ -114,7 +114,7 @@
|
||||
switch(current_order)
|
||||
if(IDLE_AGGRESSIVE)
|
||||
Find_Enemies(around)
|
||||
walk(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
if(FOLLOW_AGGRESSIVE)
|
||||
Find_Enemies(around)
|
||||
for(var/mob/living/carbon/C in around)
|
||||
@@ -131,7 +131,7 @@
|
||||
return TRUE
|
||||
Goto(C, 0.5 SECONDS, 1)
|
||||
if(IDLE_RETALIATE)
|
||||
walk(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
|
||||
for(var/mob/living/simple_animal/hostile/poison/giant_spider/hunter/infestation_spider/H in around)
|
||||
if(faction_check_mob(H) && !attack_same && !H.attack_same)
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
/obj/effect/beam/i_beam/update_icon_state()
|
||||
transform = turn(matrix(), dir2angle(dir))
|
||||
|
||||
/obj/effect/beam/i_beam/Process_Spacemove(movement_dir)
|
||||
/obj/effect/beam/i_beam/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/beam/i_beam/process()
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
if(target)
|
||||
playsound(loc, 'sound/voice/zombie_scream.ogg', 70, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/spaceinfected/Move(atom/newloc)
|
||||
/mob/living/simple_animal/hostile/spaceinfected/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE)
|
||||
if(ischasm(newloc)) // as this place filled with chasms, they shouldn't randomly fall in while wandering around
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
/////////
|
||||
var/datum/preferences/prefs = null
|
||||
var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists.
|
||||
///The visual delay to use for the current client.Move(), mostly used for making a client based move look like it came from some other slower source
|
||||
var/visual_delay = 0
|
||||
var/move_delay = 1
|
||||
var/moving = null
|
||||
var/area = null
|
||||
|
||||
@@ -308,28 +308,13 @@
|
||||
user.faction -= "carp"
|
||||
to_chat(user, "<span class='cult'>A sudden calm fills the gnashing void of your mind- you're alone now.</span>")
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/hooded/carp_costume/dragon))
|
||||
return TRUE
|
||||
//Do we have a working jetpack?
|
||||
var/obj/item/tank/jetpack/thrust
|
||||
if(istype(back, /obj/item/tank/jetpack))
|
||||
thrust = back
|
||||
else if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
|
||||
thrust = C.jetpack
|
||||
else if(ismodcontrol(back))
|
||||
var/obj/item/mod/control/C = back
|
||||
thrust = locate(/obj/item/mod/module/jetpack) in C
|
||||
if(thrust)
|
||||
if((movement_dir || thrust.stabilizers) && thrust.allow_thrust(0.01, src))
|
||||
return TRUE
|
||||
if(dna.species.spec_Process_Spacemove(src))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/hooded/carp_hood/dragon
|
||||
name = "space carp hood"
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
H.color = COLOR_BLACK
|
||||
adjustHealth(-maxHealth * 0.0125)
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
// Use any nearby blob structures to allow space moves.
|
||||
for(var/obj/structure/blob/B in range(1, src))
|
||||
return TRUE
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
var/turf/start = pick_edge_loc(startside, level_name_to_num(MAIN_STATION))
|
||||
forceMove(start)
|
||||
goal = pick_edge_loc(REVERSE_DIR(startside), level_name_to_num(MAIN_STATION))
|
||||
walk_towards(src, goal, 1)
|
||||
GLOB.move_manager.home_onto(src, goal, 1)
|
||||
|
||||
/obj/effect/space_dust/Bump(atom/A)
|
||||
if(QDELETED(src))
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
life--
|
||||
if(life <= 0)
|
||||
walk(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
on_shatter(where)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -37,3 +37,6 @@
|
||||
explosion(where, 0, pick(0,1), pick(2,3), 0)
|
||||
else
|
||||
new /mob/living/simple_animal/cow(where)
|
||||
|
||||
/obj/effect/space_dust/meaty/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
@@ -21,3 +21,9 @@
|
||||
active_keybindings[linked_bind.binded_to] += list(linked_bind)
|
||||
|
||||
return active_keybindings
|
||||
|
||||
/client/proc/calculate_move_dir()
|
||||
. = NONE
|
||||
for(var/held_key in input_data.keys_held)
|
||||
if(held_key in movement_kb_dirs)
|
||||
. |= movement_kb_dirs[held_key]
|
||||
|
||||
@@ -290,7 +290,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return
|
||||
|
||||
// Ghosts have no momentum, being massless ectoplasm
|
||||
/mob/dead/observer/Process_Spacemove(movement_dir)
|
||||
/mob/dead/observer/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
/mob/dead/observer/Move(NewLoc, direct)
|
||||
|
||||
@@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
|
||||
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)
|
||||
AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items)
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Process_Spacemove(check_drift = 0)
|
||||
/mob/living/carbon/alien/humanoid/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
if(..())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -532,7 +532,7 @@ emp_act
|
||||
bloody = TRUE
|
||||
var/turf/location = loc
|
||||
if(issimulatedturf(location))
|
||||
add_splatter_floor(location, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
|
||||
add_splatter_floor(location, emittor_intertia = last_movement_dir)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood
|
||||
|
||||
@@ -213,8 +213,8 @@
|
||||
var/current_dir
|
||||
if(isliving(AM))
|
||||
current_dir = AM.dir
|
||||
if(step(AM, t))
|
||||
step(src, t)
|
||||
if(AM.Move(get_step(AM.loc, t), t, glide_size))
|
||||
Move(get_step(loc, t), t)
|
||||
if(current_dir)
|
||||
AM.setDir(current_dir)
|
||||
now_pushing = FALSE
|
||||
@@ -598,7 +598,7 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/Move(atom/newloc, direct, movetime)
|
||||
/mob/living/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE)
|
||||
if(buckled && buckled.loc != newloc) //not updating position
|
||||
if(!buckled.anchored)
|
||||
return buckled.Move(newloc, direct)
|
||||
@@ -618,12 +618,12 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
step_count++
|
||||
pull_pulled(old_loc, pullee, movetime)
|
||||
pull_pulled(old_loc, pullee, glide_size_override)
|
||||
|
||||
if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents) first so we hopefully don't have to call get_turf() so much.
|
||||
s_active.close(src)
|
||||
|
||||
/mob/living/proc/pull_pulled(turf/dest, atom/movable/pullee, movetime)
|
||||
/mob/living/proc/pull_pulled(turf/dest, atom/movable/pullee, glide_size_override)
|
||||
if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move.
|
||||
if(pulling.anchored)
|
||||
stop_pulling()
|
||||
@@ -635,7 +635,7 @@
|
||||
var/mob/living/M = pulling
|
||||
if(IS_HORIZONTAL(M) && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) // So once you reach 50 brute damage you hit 100% chance to leave a blood trail for every tile you're pulled
|
||||
M.makeTrail(dest)
|
||||
pulling.Move(dest, get_dir(pulling, dest), movetime) // the pullee tries to reach our previous position
|
||||
pulling.Move(dest, get_dir(pulling, dest), glide_size_override) // the pullee tries to reach our previous position
|
||||
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
|
||||
stop_pulling()
|
||||
|
||||
@@ -1173,10 +1173,10 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/Moved(OldLoc, Dir, Forced = FALSE)
|
||||
/mob/living/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
|
||||
. = ..()
|
||||
for(var/obj/O in src)
|
||||
O.on_mob_move(Dir, src)
|
||||
O.on_mob_move(movement_dir, src)
|
||||
|
||||
/// Can a mob interact with the apc remotely like a pulse demon, cyborg, or AI?
|
||||
/mob/living/proc/can_remote_apc_interface(obj/machinery/power/apc/ourapc)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
if(ionpulse())
|
||||
return TRUE
|
||||
if(..())
|
||||
|
||||
@@ -163,13 +163,13 @@
|
||||
lost_target = FALSE
|
||||
last_target_location = get_turf(target)
|
||||
var/dist = get_dist(src, target)
|
||||
walk_to(src, target, 1, 4)
|
||||
GLOB.move_manager.move_to(src, target, 1, 4)
|
||||
if(get_dist(src, target) >= dist)
|
||||
frustration++
|
||||
return
|
||||
|
||||
if(!lost_target)
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
lost_target = TRUE
|
||||
frustration = 0
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
oldtarget_name = null
|
||||
anchored = FALSE
|
||||
currently_cuffing = FALSE
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
last_found = world.time
|
||||
set_weapon()
|
||||
@@ -216,7 +216,7 @@
|
||||
if(lasertag_check)
|
||||
icon_state = "[lasercolor]ed2090"
|
||||
disabled = TRUE
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
target = null
|
||||
addtimer(CALLBACK(src, PROC_REF(unset_disabled)), 10 SECONDS)
|
||||
return TRUE
|
||||
@@ -260,7 +260,7 @@
|
||||
switch(mode)
|
||||
|
||||
if(BOT_IDLE) // idle
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
if(!lasercolor) //lasertag bots don't want to arrest anyone
|
||||
if(find_new_target())
|
||||
@@ -271,7 +271,7 @@
|
||||
if(BOT_HUNT) // hunting for perp
|
||||
// if can't reach perp for long enough, go idle
|
||||
if(frustration >= 8)
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
back_to_idle()
|
||||
return
|
||||
@@ -395,7 +395,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/explode()
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
visible_message("<span class='userdanger'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
switch(mode)
|
||||
if(BOT_IDLE) // idle
|
||||
icon_state = "griefsky1"
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
if(find_new_target())
|
||||
return // see if any criminals are in range
|
||||
@@ -120,7 +120,7 @@
|
||||
icon_state = spin_icon
|
||||
playsound(loc,'sound/effects/spinsabre.ogg',50, TRUE,-1)
|
||||
if(frustration >= frustration_number) // general beepsky doesn't give up so easily, jedi scum
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
back_to_idle()
|
||||
return
|
||||
@@ -182,7 +182,7 @@
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/explode()
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
visible_message("<span class='boldannounceic'>[src] lets out a huge cough as it blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
target = null
|
||||
oldtarget_name = null
|
||||
anchored = FALSE
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
last_found = world.time
|
||||
spam_flag = FALSE
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
return
|
||||
switch(mode)
|
||||
if(BOT_IDLE) // idle
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
if(find_new_target())
|
||||
return
|
||||
if(!mode && auto_patrol)
|
||||
@@ -274,7 +274,7 @@
|
||||
if(BOT_HUNT)
|
||||
// if can't reach perp for long enough, go idle
|
||||
if(frustration >= 5) //gives up easier than beepsky
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
playsound(loc, 'sound/misc/sadtrombone.ogg', 25, TRUE, -1)
|
||||
back_to_idle()
|
||||
return
|
||||
@@ -358,7 +358,7 @@
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/explode() //doesn't drop cardboard nor its assembly, since its a very frail material.
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
visible_message("<span class='boldannounceic'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
new /obj/item/bikehorn(Tsec)
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
target = null
|
||||
oldtarget_name = null
|
||||
anchored = FALSE
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
last_found = world.time
|
||||
|
||||
@@ -315,7 +315,7 @@
|
||||
|
||||
switch(mode)
|
||||
if(BOT_IDLE) // idle
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
if(find_new_target()) // see if any criminals are in range
|
||||
return
|
||||
@@ -326,7 +326,7 @@
|
||||
// if can't reach perp for long enough, go idle
|
||||
if(frustration >= 8)
|
||||
playsound(loc, 'sound/machines/buzz-two.ogg', 25, FALSE)
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
back_to_idle()
|
||||
return
|
||||
@@ -441,7 +441,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/explode()
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
visible_message("<span class='userdanger'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
saved_turf = current_turf
|
||||
switch(mode)
|
||||
if(BOT_IDLE)
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
if(find_new_target())
|
||||
return
|
||||
@@ -98,7 +98,7 @@
|
||||
|
||||
if(BOT_HUNT)
|
||||
if(frustration >= 8)
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
set_path(null)
|
||||
back_to_idle()
|
||||
return
|
||||
@@ -165,7 +165,7 @@
|
||||
if(!QDELETED(src))
|
||||
if(depotarea)
|
||||
depotarea.list_remove(src, depotarea.guard_list)
|
||||
walk_to(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
visible_message("<span class='userdanger'>[src] blows apart!</span>")
|
||||
do_sparks(3, 1, src)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
@@ -195,7 +195,7 @@
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/speak()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/start_patrol()
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
Bring those who still cling to this world of illusion back to the master so they may know Truth.</B>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
|
||||
turns_since_scan++
|
||||
if(turns_since_scan > 5)
|
||||
walk(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
turns_since_scan = 0
|
||||
if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc)))
|
||||
movement_target = null
|
||||
@@ -172,7 +172,7 @@
|
||||
break
|
||||
if(movement_target)
|
||||
stop_automated_movement = TRUE
|
||||
walk(src, movement_target, 0, 3)
|
||||
GLOB.move_manager.move_to(src, movement_target, 0, 3)
|
||||
|
||||
/mob/living/simple_animal/pet/cat/proc_cat
|
||||
name = "Proc"
|
||||
|
||||
@@ -534,7 +534,7 @@
|
||||
minbodytemp = TCMB
|
||||
maxbodytemp = T0C + 40
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1 //Void puppies can navigate space.
|
||||
|
||||
//LISA! SQUEEEEEEEEE~
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
if(istype(L))
|
||||
faction += "\ref[L]"
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(check_drift = 0)
|
||||
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return ..() //No drifting in space for space carp! //original comments do not steal
|
||||
|
||||
/mob/living/simple_animal/hostile/scarybat/AttackingTarget()
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE //No drifting in space for space bears!
|
||||
|
||||
/mob/living/simple_animal/hostile/bear/black
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
var/static/beehometypecache = typecacheof(/obj/structure/beebox)
|
||||
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Initialize(mapload)
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
base_dead_overlay.appearance_flags = RESET_COLOR
|
||||
add_overlay(base_dead_overlay)
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE //No drifting in space for space carp! //original comments do not steal
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/AttackingTarget()
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1 //copypasta from carp code
|
||||
|
||||
/mob/living/simple_animal/hostile/deathsquid/ex_act(severity)
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
/obj/effect/gibspawner/generic,
|
||||
/obj/effect/gibspawner/generic)
|
||||
|
||||
/mob/living/simple_animal/hostile/drakehound_breacher/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/drakehound_breacher/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/drakehound_breacher/ListTargetsLazy()
|
||||
|
||||
@@ -30,5 +30,5 @@
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
@@ -422,7 +422,7 @@ Difficulty: Medium
|
||||
if(!swooping)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
/obj/effect/temp_visual/lava_warning
|
||||
|
||||
@@ -188,7 +188,7 @@ Difficulty: Medium
|
||||
var/armor = M.run_armor_check(limb_to_hit, LASER)
|
||||
M.apply_damage(70 - ((health / maxHealth) * 20), BURN, limb_to_hit, armor)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/legion/adjustHealth(amount, updating_health = TRUE)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/effect/gibspawner/generic,
|
||||
/obj/effect/gibspawner/generic)
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/pirate/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ListTargetsLazy()
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if(!has_gravity(T))
|
||||
new /obj/effect/particle_effect/ion_trails(T, _dir)
|
||||
|
||||
/mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(check_drift = 0)
|
||||
/mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/malf_drone/ListTargets()
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
icon_living = "koi[koinum]"
|
||||
icon_dead = "koi[koinum]-dead"
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(movement_dir)
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/honk
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
initial_traits = list(TRAIT_FLYING)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(check_drift = 0)
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost/Life(seconds, times_fired)
|
||||
@@ -92,7 +92,7 @@
|
||||
deathmessage = null
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir)
|
||||
/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/angered_warden
|
||||
@@ -113,7 +113,7 @@
|
||||
loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/head/warden, /obj/item/card/sec_shuttle_ruin)
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir)
|
||||
/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/zombie
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
alert_on_shield_breach = TRUE
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatequartermaster, /obj/effect/decal/cleanable/blood/innards, /obj/effect/decal/cleanable/blood, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE // he should be able to chase us in space
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize(mapload)
|
||||
@@ -334,7 +334,7 @@
|
||||
alert_on_timeout = FALSE // So random fauna doesn't make depot explode.
|
||||
loot = list() // Explodes, doesn't drop loot.
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/death()
|
||||
@@ -357,7 +357,7 @@
|
||||
/obj/effect/gibspawner/generic,
|
||||
/obj/effect/gibspawner/generic)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged
|
||||
@@ -384,7 +384,7 @@
|
||||
/obj/effect/gibspawner/generic)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
busy = SPINNING_COCOON
|
||||
visible_message("<span class='notice'>[src] begins to secrete a sticky substance around [cocoon_target].</span>")
|
||||
stop_automated_movement = TRUE
|
||||
walk(src,0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
if(do_after(src, 40, target = cocoon_target.loc))
|
||||
if(busy == SPINNING_COCOON)
|
||||
if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1)
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
new_area.Entered(src)
|
||||
else
|
||||
frustration++
|
||||
walk_to(src, entry_vent, 1)
|
||||
GLOB.move_manager.move_to(src, entry_vent, 1)
|
||||
if(frustration > 2)
|
||||
entry_vent = null
|
||||
else if(prob(33))
|
||||
@@ -165,7 +165,7 @@
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
|
||||
if(!v.welded)
|
||||
entry_vent = v
|
||||
walk_to(src, entry_vent, 1)
|
||||
GLOB.move_manager.move_to(src, entry_vent, 1)
|
||||
break
|
||||
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
new /obj/item/organ/internal/body_egg/terror_eggs(L)
|
||||
if(!ckey)
|
||||
LoseTarget()
|
||||
walk_away(src,L,2,1)
|
||||
GLOB.move_manager.move_away(src,L,2,1)
|
||||
|
||||
/proc/IsTSInfected(mob/living/carbon/C) // Terror AI requires this
|
||||
if(C.get_int_organ(/obj/item/organ/internal/body_egg))
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/shade/Process_Spacemove()
|
||||
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/shade/holy
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
/mob/living/simple_animal/Destroy()
|
||||
/// We need to clear the reference to where we're walking to properly GC
|
||||
walk_to(src, 0)
|
||||
GLOB.move_manager.stop_looping(src)
|
||||
QDEL_NULL(pcollar)
|
||||
for(var/datum/action/innate/hide/hide in actions)
|
||||
hide.Remove(src)
|
||||
@@ -627,7 +627,7 @@
|
||||
|
||||
/mob/living/simple_animal/Login()
|
||||
..()
|
||||
walk(src, 0) // if mob is moving under ai control, then stop AI movement
|
||||
GLOB.move_manager.stop_looping(src) // if mob is moving under ai control, then stop AI movement
|
||||
|
||||
/mob/living/simple_animal/proc/npc_safe(mob/user)
|
||||
return FALSE
|
||||
|
||||
@@ -223,7 +223,7 @@
|
||||
Atkcool = TRUE
|
||||
addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS)
|
||||
|
||||
/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0)
|
||||
/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 2
|
||||
|
||||
/mob/living/simple_animal/slime/get_status_tab_items()
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
affecting.grabbed_by += src
|
||||
RegisterSignal(affecting, COMSIG_MOVABLE_MOVED, PROC_REF(grab_moved))
|
||||
RegisterSignal(assailant, COMSIG_MOVABLE_MOVED, PROC_REF(pull_grabbed))
|
||||
RegisterSignal(assailant, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(on_update_glide_size))
|
||||
|
||||
hud = new /atom/movable/screen/grab(src)
|
||||
hud.icon_state = "reinforce"
|
||||
@@ -74,13 +75,21 @@
|
||||
affecting.grabbed_by -= src
|
||||
affecting = null
|
||||
if(assailant)
|
||||
UnregisterSignal(assailant, COMSIG_MOVABLE_MOVED)
|
||||
UnregisterSignal(assailant, list(
|
||||
COMSIG_MOVABLE_MOVED,
|
||||
COMSIG_MOVABLE_UPDATE_GLIDE_SIZE,
|
||||
))
|
||||
if(assailant.client)
|
||||
assailant.client.screen -= hud
|
||||
assailant = null
|
||||
|
||||
QDEL_NULL(hud)
|
||||
return ..()
|
||||
|
||||
/obj/item/grab/proc/on_update_glide_size(mob/living/grabber, new_size)
|
||||
if(affecting && grabber == assailant && affecting != assailant)
|
||||
affecting.set_glide_size(new_size)
|
||||
|
||||
/obj/item/grab/proc/pull_grabbed(mob/user, turf/old_turf, direct, forced)
|
||||
SIGNAL_HANDLER
|
||||
if(assailant.moving_diagonally == FIRST_DIAG_STEP) //we dont want to do anything in the middle of diagonal step
|
||||
@@ -88,11 +97,8 @@
|
||||
if(!assailant.Adjacent(old_turf))
|
||||
qdel(src)
|
||||
return
|
||||
var/list/grab_states_not_moving = list(GRAB_KILL, GRAB_NECK) //states of grab when we dont need affecting to be moved by himself
|
||||
var/assailant_glide_speed = TICKS2DS(world.icon_size / assailant.glide_size)
|
||||
if(state in grab_states_not_moving)
|
||||
affecting.glide_for(assailant_glide_speed)
|
||||
else if(get_turf(affecting) != old_turf)
|
||||
|
||||
if(get_turf(affecting) != old_turf)
|
||||
var/possible_dest = list()
|
||||
var/list/mobs_do_not_move = list() // those are mobs we shouldnt move while we're going to new position
|
||||
var/list/dest_1_sort = list() // just better dest to be picked first
|
||||
@@ -131,7 +137,7 @@
|
||||
if(get_turf(affecting) == dest)
|
||||
success_move = TRUE
|
||||
continue
|
||||
if(affecting.Move(dest, get_dir(affecting, dest), assailant_glide_speed))
|
||||
if(affecting.Move(dest, get_dir(affecting, dest), glide_size))
|
||||
success_move = TRUE
|
||||
break
|
||||
continue
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
#define CONFUSION_MAX 80 SECONDS
|
||||
|
||||
|
||||
/client/Move(n, direct)
|
||||
/client/Move(new_loc, direct)
|
||||
if(world.time < move_delay)
|
||||
return
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
if(!mob || !mob.loc)
|
||||
return 0
|
||||
|
||||
if(!n || !direct) // why did we never check this before?
|
||||
if(!new_loc || !direct) // why did we never check this before?
|
||||
return FALSE
|
||||
|
||||
if(mob.notransform)
|
||||
@@ -72,7 +72,7 @@
|
||||
return Move_object(direct)
|
||||
|
||||
if(!isliving(mob))
|
||||
return mob.Move(n, direct)
|
||||
return mob.Move(new_loc, direct)
|
||||
|
||||
if(mob.stat == DEAD)
|
||||
mob.ghostize()
|
||||
@@ -91,7 +91,7 @@
|
||||
if(mob.remote_control) //we're controlling something, our movement is relayed to it
|
||||
return mob.remote_control.relaymove(mob, direct)
|
||||
|
||||
if(is_ai(mob))
|
||||
if(is_ai(mob))
|
||||
var/mob/living/silicon/ai/ai = mob
|
||||
var/mob/camera/eye/ai/eye = ai.eyeobj
|
||||
if(istype(eye) && !istype(ai.remote_control))
|
||||
@@ -122,6 +122,9 @@
|
||||
if(!mob.Process_Spacemove(direct))
|
||||
return 0
|
||||
|
||||
if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_MOVE, args) & COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE)
|
||||
return FALSE
|
||||
|
||||
if(mob.restrained()) // Why being pulled while cuffed prevents you from moving
|
||||
for(var/mob/M in orange(1, mob))
|
||||
if(M.pulling == mob)
|
||||
@@ -132,20 +135,28 @@
|
||||
else
|
||||
M.stop_pulling()
|
||||
|
||||
|
||||
var/delay = mob.movement_delay()
|
||||
if(old_move_delay + world.tick_lag > world.time)
|
||||
move_delay = old_move_delay
|
||||
else
|
||||
move_delay = world.time
|
||||
mob.last_movement = world.time
|
||||
|
||||
delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds
|
||||
|
||||
// We are now going to move
|
||||
var/add_delay = mob.movement_delay()
|
||||
|
||||
if(locate(/obj/item/grab, mob))
|
||||
if(!isalienhunter(mob)) // i hate grab code
|
||||
delay += 7
|
||||
add_delay += 7
|
||||
|
||||
var/new_glide_size = DELAY_TO_GLIDE_SIZE(add_delay * ((NSCOMPONENT(direct) && EWCOMPONENT(direct)) ? sqrt(2) : 1))
|
||||
mob.set_glide_size(new_glide_size) // set it now in case of pulled objects
|
||||
|
||||
//If the move was recent, count using old_move_delay
|
||||
//We want fractional behavior and all
|
||||
if(old_move_delay + world.tick_lag > world.time)
|
||||
//Yes this makes smooth movement stutter if add_delay is too fractional
|
||||
//Yes this is better then the alternative
|
||||
move_delay = old_move_delay
|
||||
else
|
||||
move_delay = world.time
|
||||
|
||||
//Basically an optional override for our glide size
|
||||
//Sometimes you want to look like you're moving with a delay you don't actually have yet
|
||||
visual_delay = 0
|
||||
|
||||
if(istype(living_mob))
|
||||
var/newdir = NONE
|
||||
@@ -158,7 +169,7 @@
|
||||
newdir = angle2dir(dir2angle(direct) + pick(45, -45))
|
||||
if(newdir)
|
||||
direct = newdir
|
||||
n = get_step(mob, direct)
|
||||
new_loc = get_step(mob, direct)
|
||||
|
||||
mob.last_movement_dir = direct
|
||||
|
||||
@@ -166,18 +177,26 @@
|
||||
if(mob.pulling)
|
||||
prev_pulling_loc = mob.pulling.loc
|
||||
|
||||
if(!(direct & (direct - 1))) // cardinal direction
|
||||
. = mob.SelfMove(n, direct, delay)
|
||||
else // diagonal movements take longer
|
||||
var/diag_delay = delay * SQRT_2
|
||||
. = mob.SelfMove(n, direct, diag_delay)
|
||||
if(mob.loc == n)
|
||||
. = ..()
|
||||
|
||||
if(mob.loc == new_loc)
|
||||
mob.last_movement = world.time
|
||||
if(IS_DIR_DIAGONAL(direct))
|
||||
// only incur the extra delay if the move was *actually* diagonal
|
||||
// There would be a bit of visual jank if we try to walk diagonally next to a wall
|
||||
// and the move ends up being cardinal, rather than diagonal,
|
||||
// but that's better than it being jank on every *successful* diagonal move.
|
||||
delay = diag_delay
|
||||
move_delay += delay
|
||||
add_delay *= sqrt(2)
|
||||
|
||||
var/after_glide = 0
|
||||
if(visual_delay)
|
||||
after_glide = visual_delay
|
||||
else
|
||||
after_glide = DELAY_TO_GLIDE_SIZE(add_delay)
|
||||
|
||||
mob.set_glide_size(after_glide)
|
||||
|
||||
move_delay += add_delay
|
||||
|
||||
if(mob.pulledby)
|
||||
mob.pulledby.stop_pulling()
|
||||
@@ -193,9 +212,6 @@
|
||||
#undef CONFUSION_MAX
|
||||
|
||||
|
||||
/mob/proc/SelfMove(turf/n, direct, movetime)
|
||||
return Move(n, direct, movetime)
|
||||
|
||||
///Process_Grab()
|
||||
///Called by client/Move()
|
||||
///Checks to see if you are being grabbed and if so attemps to break it
|
||||
@@ -303,46 +319,76 @@
|
||||
return TRUE
|
||||
|
||||
|
||||
///Process_Spacemove
|
||||
///Called by /client/Move()
|
||||
///For moving in space
|
||||
///Return 1 for movement 0 for none
|
||||
/mob/Process_Spacemove(movement_dir = 0)
|
||||
/**
|
||||
* Handles mob/living movement in space (or no gravity)
|
||||
*
|
||||
* Called by /client/Move()
|
||||
*
|
||||
* return TRUE for movement or FALSE for none
|
||||
*/
|
||||
/mob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
if(..())
|
||||
return 1
|
||||
var/atom/movable/backup = get_spacemove_backup(movement_dir)
|
||||
if(backup)
|
||||
if(istype(backup) && movement_dir && !backup.anchored)
|
||||
var/opposite_dir = turn(movement_dir, 180)
|
||||
if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves
|
||||
to_chat(src, "<span class='notice'>You push off of [backup] to propel yourself.</span>")
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
|
||||
/mob/get_spacemove_backup(movement_dir)
|
||||
for(var/A in orange(1, get_turf(src)))
|
||||
if(isarea(A))
|
||||
// TODO: if(buckled) may belong here
|
||||
|
||||
var/atom/movable/backup = get_spacemove_backup(movement_dir, continuous_move)
|
||||
if(!backup)
|
||||
return FALSE
|
||||
|
||||
if(continuous_move || !istype(backup) || !movement_dir || backup.anchored)
|
||||
return TRUE
|
||||
|
||||
var/opposite_dir = turn(movement_dir, 180)
|
||||
if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves
|
||||
to_chat(src, "<span class='notice'>You push off of [backup] to propel yourself.</span>")
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Finds a target near a mob that is viable for pushing off when moving.
|
||||
* Takes the intended movement direction as input, alongside if the context is checking if we're allowed to continue drifting
|
||||
*/
|
||||
/mob/get_spacemove_backup(moving_direction, continuous_move)
|
||||
for(var/atom/pushover as anything in range(1, get_turf(src)))
|
||||
if(pushover == src)
|
||||
continue
|
||||
else if(isturf(A))
|
||||
var/turf/turf = A
|
||||
if(isarea(pushover))
|
||||
continue
|
||||
if(isturf(pushover))
|
||||
var/turf/turf = pushover
|
||||
if(isspaceturf(turf))
|
||||
continue
|
||||
if(!turf.density && !mob_negates_gravity())
|
||||
continue
|
||||
return A
|
||||
else
|
||||
var/atom/movable/AM = A
|
||||
if(AM == buckled) //Kind of unnecessary but let's just be sure
|
||||
continue
|
||||
if(!AM.CanPass(src) || AM.density)
|
||||
if(AM.anchored)
|
||||
return AM
|
||||
if(pulling == AM)
|
||||
continue
|
||||
if(get_turf(AM) == get_step(get_turf(src), movement_dir)) // No pushing off objects in front of you, while simultaneously pushing them fowards to go faster in space.
|
||||
continue
|
||||
. = AM
|
||||
return pushover
|
||||
|
||||
var/atom/movable/rebound = pushover
|
||||
if(rebound == buckled)
|
||||
continue
|
||||
if(ismob(rebound))
|
||||
var/mob/lover = rebound
|
||||
if(lover.buckled)
|
||||
continue
|
||||
|
||||
var/pass_allowed = rebound.CanPass(src, get_dir(rebound, src))
|
||||
if(!rebound.density && pass_allowed)
|
||||
continue
|
||||
//Sometime this tick, this pushed off something. Doesn't count as a valid pushoff target
|
||||
if(rebound.last_pushoff == world.time)
|
||||
continue
|
||||
if(continuous_move && !pass_allowed)
|
||||
var/datum/move_loop/move/rebound_engine = GLOB.move_manager.processing_on(rebound, SSspacedrift)
|
||||
// If you're moving toward it and you're both going the same direction, stop
|
||||
if(moving_direction == get_dir(src, pushover) && rebound_engine && moving_direction == rebound_engine.direction)
|
||||
continue
|
||||
else if(!pass_allowed)
|
||||
if(moving_direction == get_dir(src, pushover)) // Can't push "off" of something that you're walking into
|
||||
continue
|
||||
if(rebound.anchored)
|
||||
return rebound
|
||||
if(pulling == rebound)
|
||||
continue
|
||||
return rebound
|
||||
|
||||
/mob/proc/mob_has_gravity(turf/T)
|
||||
return has_gravity(src, T)
|
||||
@@ -350,35 +396,51 @@
|
||||
/mob/proc/mob_negates_gravity()
|
||||
return 0
|
||||
|
||||
/mob/proc/Move_Pulled(atom/A)
|
||||
if(HAS_TRAIT(src, TRAIT_CANNOT_PULL) || restrained() || !pulling)
|
||||
return
|
||||
if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src))
|
||||
/atom/movable/proc/Move_Pulled(atom/moving_atom)
|
||||
if(!pulling)
|
||||
return FALSE
|
||||
if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src, src, pulling))
|
||||
stop_pulling()
|
||||
return
|
||||
return FALSE
|
||||
if(isliving(pulling))
|
||||
var/mob/living/L = pulling
|
||||
if(L.buckled && L.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it
|
||||
var/mob/living/pulling_mob = pulling
|
||||
if(pulling_mob.buckled && pulling_mob.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it
|
||||
stop_pulling()
|
||||
return
|
||||
if(A == loc && pulling.density)
|
||||
return FALSE
|
||||
if(moving_atom == loc && pulling.density)
|
||||
return FALSE
|
||||
var/move_dir = get_dir(pulling.loc, moving_atom)
|
||||
if(!Process_Spacemove(move_dir))
|
||||
return FALSE
|
||||
if(!move_dir)
|
||||
return FALSE
|
||||
pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size)
|
||||
return TRUE
|
||||
|
||||
/mob/living/Move_Pulled(atom/moving_atom)
|
||||
. = ..()
|
||||
if(!. || !isliving(moving_atom))
|
||||
return
|
||||
if(!Process_Spacemove(get_dir(pulling.loc, A)))
|
||||
if(!Process_Spacemove(get_dir(pulling.loc, moving_atom)))
|
||||
return
|
||||
if(src in pulling.contents)
|
||||
return
|
||||
var/target_turf = get_step(pulling, get_dir(pulling.loc, A))
|
||||
var/target_turf = get_step(pulling, get_dir(pulling.loc, moving_atom))
|
||||
if(get_dist(target_turf, loc) > 1) // Make sure the turf we are trying to pull to is adjacent to the user.
|
||||
return // We do not use Adjacent() here because it checks if there are dense objects in the way, making it impossible to move an object to the side if we're blocked on both sides.
|
||||
var/move_dir = get_dir(pulling.loc, moving_atom)
|
||||
if(ismob(pulling))
|
||||
var/mob/M = pulling
|
||||
var/atom/movable/t = M.pulling
|
||||
M.stop_pulling()
|
||||
. = step(pulling, get_dir(pulling.loc, A)) // we set the return value to step here, if we don't having someone buckled in to a chair and being pulled won't let them be unbuckeled
|
||||
|
||||
// we set the return value to step here, if we don't having someone
|
||||
// buckled in to a chair and being pulled won't let them be unbuckeled
|
||||
. = pulling.Move(get_step(pulling.loc, moving_atom), move_dir, glide_size)
|
||||
if(M)
|
||||
M.start_pulling(t)
|
||||
else
|
||||
. = step(pulling, get_dir(pulling.loc, A))
|
||||
. = pulling.Move(get_step(pulling.loc, moving_atom), move_dir, glide_size)
|
||||
|
||||
/mob/proc/update_gravity(has_gravity)
|
||||
return
|
||||
|
||||
@@ -87,8 +87,6 @@
|
||||
var/emp_proof = FALSE
|
||||
/// List of overlays the mod has. Needs to be cut onremoval / module deactivation
|
||||
var/list/mod_overlays = list()
|
||||
/// Is the jetpack on so we should make ion effects?
|
||||
var/jetpack_active = FALSE
|
||||
/// Cham option for when the cham module is installed.
|
||||
var/datum/action/item_action/chameleon_change/modsuit/chameleon_action
|
||||
/// Is the control unit disquised?
|
||||
@@ -241,13 +239,6 @@
|
||||
if(slot == ITEM_SLOT_BACK)
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/control/on_mob_move(direction, mob/user)
|
||||
if(!jetpack_active || !isturf(user.loc))
|
||||
return
|
||||
var/turf/T = get_step(src, REVERSE_DIR(direction))
|
||||
if(!has_gravity(T))
|
||||
new /obj/effect/particle_effect/ion_trails(T, direction)
|
||||
|
||||
/obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
|
||||
. = ..()
|
||||
if(!wearer || old_loc != wearer || loc == wearer)
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
if(!mod.active || mod.activating || !mod.get_charge())
|
||||
to_chat(mod.wearer, "<span class='warning'>Module is unpowered!</span>")
|
||||
return FALSE
|
||||
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE)
|
||||
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE)
|
||||
return FALSE
|
||||
if(module_type == MODULE_ACTIVE)
|
||||
if(mod.selected_module && !mod.selected_module.on_deactivation(display_message = FALSE))
|
||||
@@ -157,7 +157,7 @@
|
||||
else if(display_message)
|
||||
to_chat(mod.wearer, "<span class='notice'>[src] deactivated.</span>")
|
||||
//mod.wearer.update_clothing(mod.slot_flags)
|
||||
SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED)
|
||||
SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED, mod.wearer)
|
||||
mod.update_mod_overlays()
|
||||
return TRUE
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
if(!check_power(use_power_cost))
|
||||
to_chat(mod.wearer, "<span class='warning'>Module costs too much power to use!</span>")
|
||||
return FALSE
|
||||
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE)
|
||||
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE)
|
||||
return FALSE
|
||||
COOLDOWN_START(src, cooldown_timer, cooldown_time)
|
||||
//addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_clothing), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts
|
||||
|
||||
@@ -128,40 +128,51 @@
|
||||
overlay_state_inactive = "module_jetpack"
|
||||
overlay_state_active = "module_jetpack_on"
|
||||
/// Do we stop the wearer from gliding in space.
|
||||
var/stabilizers = FALSE
|
||||
var/stabilize = FALSE
|
||||
var/thrust_callback
|
||||
|
||||
/obj/item/mod/module/jetpack/proc/set_stabilizers(new_stabilizers)
|
||||
if(stabilizers == new_stabilizers)
|
||||
return
|
||||
stabilizers = new_stabilizers
|
||||
/obj/item/mod/module/jetpack/Initialize(mapload)
|
||||
. = ..()
|
||||
thrust_callback = CALLBACK(src, PROC_REF(allow_thrust))
|
||||
configure_jetpack(stabilize)
|
||||
|
||||
/obj/item/mod/module/jetpack/Destroy()
|
||||
thrust_callback = null
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* configures/re-configures the jetpack component
|
||||
*
|
||||
* Arguments
|
||||
* stabilize - Should this jetpack be stabalized
|
||||
*/
|
||||
/obj/item/mod/module/jetpack/proc/configure_jetpack(stabilize)
|
||||
src.stabilize = stabilize
|
||||
|
||||
AddComponent( \
|
||||
/datum/component/jetpack, \
|
||||
src.stabilize, \
|
||||
COMSIG_MODULE_TRIGGERED, \
|
||||
COMSIG_MODULE_DEACTIVATED, \
|
||||
MOD_ABORT_USE, \
|
||||
thrust_callback, \
|
||||
/datum/effect_system/trail_follow/ion/grav_allowed \
|
||||
)
|
||||
|
||||
/obj/item/mod/module/jetpack/get_configuration()
|
||||
. = ..()
|
||||
.["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers)
|
||||
.["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilize)
|
||||
|
||||
/obj/item/mod/module/jetpack/configure_edit(key, value)
|
||||
switch(key)
|
||||
if("stabilizers")
|
||||
set_stabilizers(value)
|
||||
configure_jetpack(value)
|
||||
|
||||
/obj/item/mod/module/jetpack/proc/allow_thrust()
|
||||
if(!active)
|
||||
return
|
||||
if(!drain_power(use_power_cost))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/mod/module/jetpack/proc/get_user()
|
||||
return mod.wearer
|
||||
|
||||
/obj/item/mod/module/jetpack/on_activation()
|
||||
. = ..()
|
||||
mod.jetpack_active = TRUE
|
||||
|
||||
/obj/item/mod/module/jetpack/on_deactivation(display_message, deleting)
|
||||
. = ..()
|
||||
mod.jetpack_active = FALSE
|
||||
|
||||
/obj/item/mod/module/jetpack/advanced
|
||||
name = "MOD advanced ion jetpack module"
|
||||
desc = "An improvement on the previous model of electric thrusters. This one achieves better efficency through \
|
||||
|
||||
@@ -107,7 +107,7 @@ GLOBAL_VAR_INIT(global_singulo_id, 1)
|
||||
B.remove(C)
|
||||
qdel(B)
|
||||
|
||||
/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man!
|
||||
/obj/singularity/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) //The singularity stops drifting for no man!
|
||||
return 0
|
||||
|
||||
/obj/singularity/blob_act(obj/structure/blob/B)
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
// MORE POWER
|
||||
movement_beam(move_target, 1 SECONDS)
|
||||
sleep(0.5 SECONDS)
|
||||
walk_towards(src, move_target, 0, 10)
|
||||
GLOB.move_manager.home_onto(src, move_target, 0, 10)
|
||||
|
||||
/obj/singularity/energy_ball/proc/on_atom_entered(datum/source, atom/movable/entered)
|
||||
var/mob/living/living_entered = entered
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
picked_mob.bullet_act(src, def_zone)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/Process_Spacemove(movement_dir = 0)
|
||||
/obj/item/projectile/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return 1 //Bullets don't drift in space
|
||||
|
||||
/obj/item/projectile/process()
|
||||
|
||||
@@ -77,23 +77,14 @@
|
||||
|
||||
|
||||
/obj/item/reagent_containers/spray/proc/spray(atom/A)
|
||||
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
|
||||
D.create_reagents(amount_per_transfer_from_this)
|
||||
reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_currentrange)
|
||||
D.icon += mix_color_from_reagents(D.reagents.reagent_list)
|
||||
|
||||
for(var/i in 1 to spray_currentrange)
|
||||
if(!step_towards(D, A) && i != 1)
|
||||
qdel(D)
|
||||
return
|
||||
D.reagents.reaction(get_turf(D))
|
||||
for(var/atom/T in get_turf(D))
|
||||
D.reagents.reaction(T)
|
||||
sleep(3)
|
||||
if(QDELETED(D))
|
||||
return
|
||||
qdel(D)
|
||||
var/obj/effect/decal/chempuff/chem_puff = new /obj/effect/decal/chempuff(get_turf(src))
|
||||
chem_puff.create_reagents(amount_per_transfer_from_this)
|
||||
reagents.trans_to(chem_puff, amount_per_transfer_from_this, 1/spray_currentrange)
|
||||
chem_puff.icon += mix_color_from_reagents(chem_puff.reagents.reagent_list)
|
||||
|
||||
var/datum/move_loop/our_loop = GLOB.move_manager.move_towards_legacy(chem_puff, A, 3 DECISECONDS, timeout = spray_currentrange * 3 DECISECONDS, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
|
||||
chem_puff.RegisterSignal(our_loop, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/obj/effect/decal/chempuff, loop_ended))
|
||||
chem_puff.RegisterSignal(our_loop, COMSIG_MOVELOOP_POSTPROCESS, TYPE_PROC_REF(/obj/effect/decal/chempuff, check_move))
|
||||
|
||||
/obj/item/reagent_containers/spray/attack_self__legacy__attackchain(mob/user)
|
||||
|
||||
|
||||
@@ -87,9 +87,9 @@
|
||||
blood_volume = max(blood_volume - amt, 0)
|
||||
if(isturf(loc)) //Blood loss still happens in locker, floor stays clean
|
||||
if(amt >= 10)
|
||||
add_splatter_floor(loc, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
|
||||
add_splatter_floor(loc)
|
||||
else
|
||||
add_splatter_floor(loc, 1, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
|
||||
add_splatter_floor(loc, 1)
|
||||
|
||||
/mob/living/carbon/human/bleed(amt)
|
||||
amt *= physiology.bleed_mod
|
||||
@@ -108,7 +108,7 @@
|
||||
blood_volume = max(blood_volume - amt, 0)
|
||||
if(prob(10 * amt)) // +5% chance per internal bleeding site that we'll cough up blood on a given tick.
|
||||
custom_emote(EMOTE_VISIBLE, "coughs up blood!")
|
||||
add_splatter_floor(loc, 1, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
|
||||
add_splatter_floor(loc, 1)
|
||||
return 1
|
||||
else if(amt >= 1 && prob(5 * amt)) // +2.5% chance per internal bleeding site that we'll cough up blood on a given tick. Must be bleeding internally in more than one place to have a chance at this.
|
||||
vomit(0, 1)
|
||||
@@ -256,7 +256,7 @@
|
||||
. += list("O-", "O+")
|
||||
|
||||
//to add a splatter of blood or other mob liquid.
|
||||
/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y, emittor_intertia)
|
||||
/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
|
||||
if((get_blood_id() != "blood") && (get_blood_id() != "slimejelly"))//is it blood or welding fuel?
|
||||
return
|
||||
if(!T)
|
||||
@@ -264,13 +264,14 @@
|
||||
|
||||
var/list/temp_blood_DNA
|
||||
var/list/b_data = get_blood_data(get_blood_id())
|
||||
var/datum/move_loop/move/move_loop = GLOB.move_manager.processing_on(src, SSspacedrift)
|
||||
|
||||
if(small_drip)
|
||||
// Only a certain number of drips (or one large splatter) can be on a given turf.
|
||||
var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T
|
||||
if(drop)
|
||||
if(emittor_intertia)
|
||||
drop.newtonian_move(emittor_intertia)
|
||||
if(move_loop)
|
||||
drop.newtonian_move(move_loop.direction, instant = TRUE)
|
||||
if(drop.drips < 5)
|
||||
drop.drips++
|
||||
var/image/I = image(drop.icon, drop.random_icon_states)
|
||||
@@ -295,8 +296,8 @@
|
||||
else
|
||||
drop.basecolor = "#A10808"
|
||||
drop.update_icon()
|
||||
if(emittor_intertia)
|
||||
drop.newtonian_move(emittor_intertia)
|
||||
if(move_loop)
|
||||
drop.newtonian_move(move_loop.direction, instant = TRUE)
|
||||
return
|
||||
|
||||
// Find a blood decal or create a new one.
|
||||
@@ -318,8 +319,8 @@
|
||||
if(shift_x || shift_y)
|
||||
B.off_floor = TRUE
|
||||
B.layer = BELOW_MOB_LAYER //So the blood lands ontop of things like posters, windows, etc.
|
||||
if(emittor_intertia)
|
||||
B.newtonian_move(emittor_intertia)
|
||||
if(move_loop)
|
||||
B.newtonian_move(move_loop.direction, instant = TRUE)
|
||||
|
||||
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip, shift_x, shift_y, emittor_intertia)
|
||||
if(!(NO_BLOOD in dna.species.species_traits))
|
||||
|
||||
@@ -320,10 +320,10 @@
|
||||
if(isobj(H.shoes))
|
||||
var/thingy = H.shoes
|
||||
if(H.drop_item_to_ground(H.shoes))
|
||||
walk_away(thingy,H,15,2)
|
||||
GLOB.move_manager.move_away(thingy, H, 15, 2)
|
||||
spawn(20)
|
||||
if(thingy)
|
||||
walk(thingy,0)
|
||||
GLOB.move_manager.stop_looping(thingy)
|
||||
|
||||
/obj/item/organ/internal/honktumor/cursed
|
||||
unremovable = TRUE
|
||||
|
||||
@@ -1,50 +1,38 @@
|
||||
/obj/vehicle/space/speedbike
|
||||
/obj/tgvehicle/speedbike
|
||||
name = "Speedbike"
|
||||
icon = 'icons/obj/bike.dmi'
|
||||
icon_state = "speedbike_blue"
|
||||
layer = MOB_LAYER - 0.1
|
||||
vehicle_move_delay = 0
|
||||
var/overlay_state = "cover_blue"
|
||||
var/mutable_appearance/overlay
|
||||
layer = LYING_MOB_LAYER
|
||||
var/cover_iconstate = "cover_blue"
|
||||
|
||||
/obj/vehicle/space/speedbike/Initialize(mapload)
|
||||
/obj/tgvehicle/speedbike/Initialize(mapload)
|
||||
. = ..()
|
||||
overlay = mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER)
|
||||
add_overlay(overlay)
|
||||
add_overlay(image(icon, cover_iconstate, ABOVE_MOB_LAYER))
|
||||
AddElement(/datum/element/ridable, /datum/component/riding/vehicle/speedbike)
|
||||
|
||||
/obj/vehicle/space/speedbike/Move(newloc,move_dir)
|
||||
/obj/tgvehicle/speedbike/Move(newloc,move_dir)
|
||||
if(has_buckled_mobs())
|
||||
new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc)
|
||||
. = ..()
|
||||
|
||||
/obj/vehicle/space/speedbike/handle_vehicle_layer()
|
||||
switch(dir)
|
||||
if(NORTH,SOUTH)
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
if(EAST,WEST)
|
||||
pixel_x = -18
|
||||
pixel_y = 0
|
||||
|
||||
/obj/vehicle/space/speedbike/handle_vehicle_offsets()
|
||||
if(has_buckled_mobs())
|
||||
for(var/m in buckled_mobs)
|
||||
var/mob/living/buckled_mob = m
|
||||
buckled_mob.setDir(dir)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = -8
|
||||
if(SOUTH)
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = 4
|
||||
if(EAST)
|
||||
buckled_mob.pixel_x = -10
|
||||
buckled_mob.pixel_y = 5
|
||||
if(WEST)
|
||||
buckled_mob.pixel_x = 10
|
||||
buckled_mob.pixel_y = 5
|
||||
|
||||
/obj/vehicle/space/speedbike/red
|
||||
/obj/tgvehicle/speedbike/red
|
||||
icon_state = "speedbike_red"
|
||||
overlay_state = "cover_red"
|
||||
cover_iconstate = "cover_red"
|
||||
|
||||
/datum/component/riding/vehicle/speedbike
|
||||
vehicle_move_delay = 1
|
||||
override_allow_spacemove = TRUE
|
||||
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
|
||||
|
||||
/datum/component/riding/vehicle/speedbike/handle_specials()
|
||||
. = ..()
|
||||
set_vehicle_dir_layer(SOUTH, OBJ_LAYER)
|
||||
set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER)
|
||||
set_vehicle_dir_layer(EAST, OBJ_LAYER)
|
||||
set_vehicle_dir_layer(WEST, OBJ_LAYER)
|
||||
|
||||
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, -8), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-10, 5), TEXT_WEST = list(10, 5)))
|
||||
set_vehicle_dir_offsets(NORTH, -16, -16)
|
||||
set_vehicle_dir_offsets(SOUTH, -16, -16)
|
||||
set_vehicle_dir_offsets(EAST, -18, 0)
|
||||
set_vehicle_dir_offsets(WEST, -18, 0)
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
return //write specifics for different vehicles
|
||||
|
||||
|
||||
/obj/vehicle/Process_Spacemove(direction)
|
||||
/obj/vehicle/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
if(has_gravity(src))
|
||||
return TRUE
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
pressure_resistance = INFINITY
|
||||
spaceworthy = TRUE
|
||||
|
||||
/obj/vehicle/space/Process_Spacemove(direction)
|
||||
/obj/vehicle/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/zap_act(power, zap_flags)
|
||||
|
||||
Reference in New Issue
Block a user