push
This commit is contained in:
@@ -8,23 +8,41 @@
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
COOLDOWN_DECLARE(cooldown_vehicle_move)
|
||||
var/list/mob/occupants //mob = bitflags of their control level.
|
||||
/// mob = bitflags of their control level.
|
||||
var/list/mob/occupants
|
||||
var/max_occupants = 1
|
||||
/// Maximum amount of drivers
|
||||
var/max_drivers = 1
|
||||
var/movedelay = 2
|
||||
var/lastmove = 0
|
||||
/**
|
||||
* If the driver needs a certain item in hand (or inserted, for vehicles) to drive this. For vehicles, this must be duplicated on their riding component subtype
|
||||
* [/datum/component/riding/var/keytype] variable because only a few specific checks are handled here with this var, and the majority of it is on the riding component
|
||||
* Eventually the remaining checks should be moved to the component and this var removed.
|
||||
*/
|
||||
var/key_type
|
||||
/// The inserted key, needed on some vehicles to start the engine
|
||||
var/obj/item/key/inserted_key
|
||||
var/key_type_exact = TRUE //can subtypes work
|
||||
/// Can subtypes of this key work
|
||||
var/key_type_exact = TRUE
|
||||
/// Whether the vehicle is currently able to move
|
||||
var/canmove = TRUE
|
||||
var/emulate_door_bumps = TRUE //when bumping a door try to make occupants bump them to open them.
|
||||
var/default_driver_move = TRUE //handle driver movement instead of letting something else do it like riding datums.
|
||||
var/enclosed = FALSE // is the rider protected from bullets? assume no
|
||||
var/list/autogrant_actions_passenger //plain list of typepaths
|
||||
var/list/autogrant_actions_controller //assoc list "[bitflag]" = list(typepaths)
|
||||
var/list/mob/occupant_actions //assoc list mob = list(type = action datum assigned to mob)
|
||||
/// When bumping a door try to make occupants bump them to open them.
|
||||
var/emulate_door_bumps = TRUE
|
||||
/// Handle driver movement instead of letting something else do it like riding datums.
|
||||
var/default_driver_move = TRUE
|
||||
/// Is the rider protected from bullets? assume no
|
||||
var/enclosed = FALSE
|
||||
/// Plain list of typepaths
|
||||
var/list/autogrant_actions_passenger
|
||||
/// Assoc list "[bitflag]" = list(typepaths)
|
||||
var/list/autogrant_actions_controller
|
||||
/// Assoc list mob = list(type = action datum assigned to mob)
|
||||
var/list/mob/occupant_actions
|
||||
/// This vehicle will follow us when we move (like atrailer duh)
|
||||
var/obj/vehicle/trailer
|
||||
var/mouse_pointer //do we have a special mouse
|
||||
/// Do we have a special mouse
|
||||
var/mouse_pointer
|
||||
|
||||
/obj/vehicle/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -37,18 +55,29 @@
|
||||
/obj/vehicle/examine(mob/user)
|
||||
. = ..()
|
||||
if(resistance_flags & ON_FIRE)
|
||||
. += "<span class='warning'>It's on fire!</span>"
|
||||
var/healthpercent = obj_integrity/max_integrity * 100
|
||||
switch(healthpercent)
|
||||
if(50 to 99)
|
||||
. += "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
. += "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
. += "<span class='warning'>It's falling apart!</span>"
|
||||
. += span_warning("It's on fire!")
|
||||
. += generate_integrity_message()
|
||||
|
||||
/obj/vehicle/proc/is_key(obj/item/I)
|
||||
return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE
|
||||
/// Returns a readable string of the vehicle's health for examining. Overridden by subtypes who want to be more verbose with their health messages.
|
||||
/obj/vehicle/proc/generate_integrity_message()
|
||||
var/examine_text = ""
|
||||
var/integrity = obj_integrity/max_integrity * 100
|
||||
switch(integrity)
|
||||
if(50 to 99)
|
||||
examine_text = "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
examine_text = "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
examine_text = span_warning("It's falling apart!")
|
||||
|
||||
return examine_text
|
||||
|
||||
/obj/vehicle/proc/is_key(obj/item/possible_key)
|
||||
if(possible_key)
|
||||
if(key_type_exact)
|
||||
return possible_key.type == key_type
|
||||
return istype(possible_key, key_type)
|
||||
return FALSE
|
||||
|
||||
/obj/vehicle/proc/return_occupants()
|
||||
return occupants
|
||||
@@ -79,7 +108,7 @@
|
||||
return is_occupant(M) && occupants[M] & VEHICLE_CONTROL_DRIVE
|
||||
|
||||
/obj/vehicle/proc/is_occupant(mob/M)
|
||||
return !isnull(occupants[M])
|
||||
return !isnull(LAZYACCESS(occupants, M))
|
||||
|
||||
/obj/vehicle/proc/add_occupant(mob/M, control_flags)
|
||||
if(!istype(M) || is_occupant(M))
|
||||
@@ -99,6 +128,7 @@
|
||||
add_control_flags(M, VEHICLE_CONTROL_DRIVE)
|
||||
|
||||
/obj/vehicle/proc/remove_occupant(mob/M)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
remove_control_flags(M, ALL)
|
||||
@@ -111,13 +141,15 @@
|
||||
/obj/vehicle/proc/after_remove_occupant(mob/M)
|
||||
|
||||
/obj/vehicle/relaymove(mob/user, direction)
|
||||
if(!canmove)
|
||||
return FALSE
|
||||
if(is_driver(user))
|
||||
return driver_move(user, direction)
|
||||
return FALSE
|
||||
|
||||
/obj/vehicle/proc/driver_move(mob/user, direction)
|
||||
if(key_type && !is_key(inserted_key))
|
||||
to_chat(user, "<span class='warning'>[src] has no key inserted!</span>")
|
||||
to_chat(user, span_warning("[src] has no key inserted!"))
|
||||
return FALSE
|
||||
if(!default_driver_move)
|
||||
return
|
||||
@@ -127,15 +159,15 @@
|
||||
if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move))
|
||||
return FALSE
|
||||
COOLDOWN_START(src, cooldown_vehicle_move, movedelay)
|
||||
|
||||
if(trailer)
|
||||
var/dir_to_move = get_dir(trailer.loc, loc)
|
||||
var/did_move = step(src, direction)
|
||||
if(did_move)
|
||||
step(trailer, dir_to_move)
|
||||
return did_move
|
||||
else
|
||||
after_move(direction)
|
||||
return step(src, direction)
|
||||
after_move(direction)
|
||||
return step(src, direction)
|
||||
|
||||
/obj/vehicle/proc/after_move(direction)
|
||||
return
|
||||
@@ -165,10 +197,24 @@
|
||||
for(var/m in occupants)
|
||||
M.Bumped(m)
|
||||
|
||||
/// To add a trailer to the vehicle in a manner that allows safe qdels
|
||||
/obj/vehicle/proc/add_trailer(obj/vehicle/added_vehicle)
|
||||
trailer = added_vehicle
|
||||
RegisterSignal(trailer, COMSIG_PARENT_QDELETING, PROC_REF(remove_trailer))
|
||||
|
||||
/// To remove a trailer from the vehicle in a manner that allows safe qdels
|
||||
/obj/vehicle/proc/remove_trailer()
|
||||
SIGNAL_HANDLER
|
||||
UnregisterSignal(trailer, COMSIG_PARENT_QDELETING)
|
||||
trailer = null
|
||||
|
||||
/obj/vehicle/Move(newloc, dir)
|
||||
// It is unfortunate, but this is the way to make it not mess up
|
||||
var/atom/old_loc = loc
|
||||
// When we do this, it will set the loc to the new loc
|
||||
. = ..()
|
||||
if(trailer && .)
|
||||
var/dir_to_move = get_dir(trailer.loc, newloc)
|
||||
var/dir_to_move = get_dir(trailer.loc, old_loc)
|
||||
step(trailer, dir_to_move)
|
||||
|
||||
/obj/vehicle/bullet_act(obj/item/projectile/Proj) //wrapper
|
||||
|
||||
Reference in New Issue
Block a user