Merge remote-tracking branch 'citadel/master' into mobility_flags
This commit is contained in:
@@ -107,7 +107,7 @@
|
||||
visible_message("<span class='danger'>[user] has pressed one of the colorful buttons on [src] and the clown car spews out a cloud of laughing gas.</span>")
|
||||
var/datum/reagents/R = new/datum/reagents(300)
|
||||
R.my_atom = src
|
||||
R.add_reagent("superlaughter", 50)
|
||||
R.add_reagent(/datum/reagent/consumable/superlaughter, 50)
|
||||
var/datum/effect_system/smoke_spread/chem/smoke = new()
|
||||
smoke.set_up(R, 4)
|
||||
smoke.attach(src)
|
||||
|
||||
@@ -1,69 +1,69 @@
|
||||
|
||||
//Boat
|
||||
|
||||
/obj/vehicle/ridden/lavaboat
|
||||
name = "lava boat"
|
||||
desc = "A boat used for traversing lava."
|
||||
icon_state = "goliath_boat"
|
||||
icon = 'icons/obj/lavaland/dragonboat.dmi'
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
can_buckle = TRUE
|
||||
|
||||
/obj/vehicle/ridden/lavaboat/Initialize()
|
||||
. = ..()
|
||||
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
|
||||
D.keytype = /obj/item/oar
|
||||
D.allowed_turf_typecache = typecacheof(/turf/open/lava)
|
||||
|
||||
/obj/item/oar
|
||||
name = "oar"
|
||||
icon = 'icons/obj/vehicles.dmi'
|
||||
icon_state = "oar"
|
||||
item_state = "oar"
|
||||
lefthand_file = 'icons/mob/inhands/misc/lavaland_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/lavaland_righthand.dmi'
|
||||
desc = "Not to be confused with the kind Research hassles you for."
|
||||
force = 12
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
|
||||
/datum/crafting_recipe/oar
|
||||
name = "Goliath Bone Oar"
|
||||
result = /obj/item/oar
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2)
|
||||
time = 15
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/boat
|
||||
name = "Goliath Hide Boat"
|
||||
result = /obj/vehicle/ridden/lavaboat
|
||||
reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
|
||||
time = 50
|
||||
category = CAT_PRIMAL
|
||||
|
||||
//Dragon Boat
|
||||
|
||||
|
||||
/obj/item/ship_in_a_bottle
|
||||
name = "ship in a bottle"
|
||||
desc = "A tiny ship inside a bottle."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "ship_bottle"
|
||||
|
||||
/obj/item/ship_in_a_bottle/attack_self(mob/user)
|
||||
to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.")
|
||||
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
||||
new /obj/vehicle/ridden/lavaboat/dragon(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/vehicle/ridden/lavaboat/dragon
|
||||
name = "mysterious boat"
|
||||
desc = "This boat moves where you will it, without the need for an oar."
|
||||
icon_state = "dragon_boat"
|
||||
|
||||
/obj/vehicle/ridden/lavaboat/dragon/Initialize()
|
||||
. = ..()
|
||||
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = 1
|
||||
D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 2), TEXT_SOUTH = list(1, 2), TEXT_EAST = list(1, 2), TEXT_WEST = list( 1, 2)))
|
||||
D.keytype = null
|
||||
|
||||
//Boat
|
||||
|
||||
/obj/vehicle/ridden/lavaboat
|
||||
name = "lava boat"
|
||||
desc = "A boat used for traversing lava."
|
||||
icon_state = "goliath_boat"
|
||||
icon = 'icons/obj/lavaland/dragonboat.dmi'
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
can_buckle = TRUE
|
||||
|
||||
/obj/vehicle/ridden/lavaboat/Initialize()
|
||||
. = ..()
|
||||
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
|
||||
D.keytype = /obj/item/oar
|
||||
D.allowed_turf_typecache = typecacheof(/turf/open/lava)
|
||||
|
||||
/obj/item/oar
|
||||
name = "oar"
|
||||
icon = 'icons/obj/vehicles.dmi'
|
||||
icon_state = "oar"
|
||||
item_state = "oar"
|
||||
lefthand_file = 'icons/mob/inhands/misc/lavaland_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/lavaland_righthand.dmi'
|
||||
desc = "Not to be confused with the kind Research hassles you for."
|
||||
force = 12
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
|
||||
/datum/crafting_recipe/oar
|
||||
name = "Goliath Bone Oar"
|
||||
result = /obj/item/oar
|
||||
reqs = list(/obj/item/stack/sheet/bone = 2)
|
||||
time = 15
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/boat
|
||||
name = "Goliath Hide Boat"
|
||||
result = /obj/vehicle/ridden/lavaboat
|
||||
reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
|
||||
time = 50
|
||||
category = CAT_PRIMAL
|
||||
|
||||
//Dragon Boat
|
||||
|
||||
|
||||
/obj/item/ship_in_a_bottle
|
||||
name = "ship in a bottle"
|
||||
desc = "A tiny ship inside a bottle."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "ship_bottle"
|
||||
|
||||
/obj/item/ship_in_a_bottle/attack_self(mob/user)
|
||||
to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.")
|
||||
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
||||
new /obj/vehicle/ridden/lavaboat/dragon(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/vehicle/ridden/lavaboat/dragon
|
||||
name = "mysterious boat"
|
||||
desc = "This boat moves where you will it, without the need for an oar."
|
||||
icon_state = "dragon_boat"
|
||||
|
||||
/obj/vehicle/ridden/lavaboat/dragon/Initialize()
|
||||
. = ..()
|
||||
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = 1
|
||||
D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 2), TEXT_SOUTH = list(1, 2), TEXT_EAST = list(1, 2), TEXT_WEST = list( 1, 2)))
|
||||
D.keytype = null
|
||||
|
||||
@@ -1,79 +1,79 @@
|
||||
/obj/vehicle/ridden
|
||||
name = "ridden vehicle"
|
||||
can_buckle = TRUE
|
||||
max_buckled_mobs = 1
|
||||
buckle_lying = FALSE
|
||||
default_driver_move = FALSE
|
||||
var/legs_required = 1
|
||||
var/arms_required = 0 //why not?
|
||||
|
||||
/obj/vehicle/ridden/Initialize()
|
||||
. = ..()
|
||||
LoadComponent(/datum/component/riding)
|
||||
|
||||
/obj/vehicle/ridden/examine(mob/user)
|
||||
. = ..()
|
||||
if(key_type)
|
||||
if(!inserted_key)
|
||||
. += "<span class='notice'>Put a key inside it by clicking it with the key.</span>"
|
||||
else
|
||||
. += "<span class='notice'>Alt-click [src] to remove the key.</span>"
|
||||
|
||||
/obj/vehicle/ridden/generate_action_type(actiontype)
|
||||
var/datum/action/vehicle/ridden/A = ..()
|
||||
. = A
|
||||
if(istype(A))
|
||||
A.vehicle_ridden_target = src
|
||||
|
||||
/obj/vehicle/ridden/post_unbuckle_mob(mob/living/M)
|
||||
remove_occupant(M)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/post_buckle_mob(mob/living/M)
|
||||
add_occupant(M)
|
||||
if(M.get_num_legs() < legs_required)
|
||||
to_chat(M, "<span class='warning'>You don't have enough legs to operate the pedals!</span>")
|
||||
unbuckle_mob(M)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/attackby(obj/item/I, mob/user, params)
|
||||
if(key_type && !is_key(inserted_key) && is_key(I))
|
||||
if(user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='notice'>You insert \the [I] into \the [src].</span>")
|
||||
if(inserted_key) //just in case there's an invalid key
|
||||
inserted_key.forceMove(drop_location())
|
||||
inserted_key = I
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[I] seems to be stuck to your hand!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
if(!is_occupant(user))
|
||||
to_chat(user, "<span class='notice'>You must be riding the [src] to remove [src]'s key!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You remove \the [inserted_key] from \the [src].</span>")
|
||||
inserted_key.forceMove(drop_location())
|
||||
user.put_in_hands(inserted_key)
|
||||
inserted_key = null
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/ridden/driver_move(mob/user, direction)
|
||||
if(key_type && !is_key(inserted_key))
|
||||
to_chat(user, "<span class='warning'>[src] has no key inserted!</span>")
|
||||
return FALSE
|
||||
var/datum/component/riding/R = GetComponent(/datum/component/riding)
|
||||
R.handle_ride(user, direction)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE)
|
||||
if(!in_range(user, src) || !in_range(M, src))
|
||||
return FALSE
|
||||
. = ..(M, user, FALSE)
|
||||
|
||||
/obj/vehicle/ridden/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
|
||||
if(!force && occupant_amount() >= max_occupants)
|
||||
return FALSE
|
||||
return ..()
|
||||
/obj/vehicle/ridden
|
||||
name = "ridden vehicle"
|
||||
can_buckle = TRUE
|
||||
max_buckled_mobs = 1
|
||||
buckle_lying = FALSE
|
||||
default_driver_move = FALSE
|
||||
var/legs_required = 1
|
||||
var/arms_required = 0 //why not?
|
||||
|
||||
/obj/vehicle/ridden/Initialize()
|
||||
. = ..()
|
||||
LoadComponent(/datum/component/riding)
|
||||
|
||||
/obj/vehicle/ridden/examine(mob/user)
|
||||
. = ..()
|
||||
if(key_type)
|
||||
if(!inserted_key)
|
||||
. += "<span class='notice'>Put a key inside it by clicking it with the key.</span>"
|
||||
else
|
||||
. += "<span class='notice'>Alt-click [src] to remove the key.</span>"
|
||||
|
||||
/obj/vehicle/ridden/generate_action_type(actiontype)
|
||||
var/datum/action/vehicle/ridden/A = ..()
|
||||
. = A
|
||||
if(istype(A))
|
||||
A.vehicle_ridden_target = src
|
||||
|
||||
/obj/vehicle/ridden/post_unbuckle_mob(mob/living/M)
|
||||
remove_occupant(M)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/post_buckle_mob(mob/living/M)
|
||||
add_occupant(M)
|
||||
if(M.get_num_legs() < legs_required)
|
||||
to_chat(M, "<span class='warning'>You don't have enough legs to operate the pedals!</span>")
|
||||
unbuckle_mob(M)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/attackby(obj/item/I, mob/user, params)
|
||||
if(key_type && !is_key(inserted_key) && is_key(I))
|
||||
if(user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='notice'>You insert \the [I] into \the [src].</span>")
|
||||
if(inserted_key) //just in case there's an invalid key
|
||||
inserted_key.forceMove(drop_location())
|
||||
inserted_key = I
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[I] seems to be stuck to your hand!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
if(!is_occupant(user))
|
||||
to_chat(user, "<span class='notice'>You must be riding the [src] to remove [src]'s key!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You remove \the [inserted_key] from \the [src].</span>")
|
||||
inserted_key.forceMove(drop_location())
|
||||
user.put_in_hands(inserted_key)
|
||||
inserted_key = null
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/ridden/driver_move(mob/user, direction)
|
||||
if(key_type && !is_key(inserted_key))
|
||||
to_chat(user, "<span class='warning'>[src] has no key inserted!</span>")
|
||||
return FALSE
|
||||
var/datum/component/riding/R = GetComponent(/datum/component/riding)
|
||||
R.handle_ride(user, direction)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE)
|
||||
if(!in_range(user, src) || !in_range(M, src))
|
||||
return FALSE
|
||||
. = ..(M, user, FALSE)
|
||||
|
||||
/obj/vehicle/ridden/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
|
||||
if(!force && occupant_amount() >= max_occupants)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -1,166 +1,166 @@
|
||||
//VEHICLE DEFAULT HANDLING
|
||||
/obj/vehicle/proc/generate_actions()
|
||||
return
|
||||
|
||||
/obj/vehicle/proc/generate_action_type(actiontype)
|
||||
var/datum/action/vehicle/A = new actiontype
|
||||
if(!istype(A))
|
||||
return
|
||||
A.vehicle_target = src
|
||||
return A
|
||||
|
||||
/obj/vehicle/proc/initialize_passenger_action_type(actiontype)
|
||||
autogrant_actions_passenger += actiontype
|
||||
for(var/i in occupants)
|
||||
grant_passenger_actions(i) //refresh
|
||||
|
||||
/obj/vehicle/proc/initialize_controller_action_type(actiontype, control_flag)
|
||||
LAZYINITLIST(autogrant_actions_controller["[control_flag]"])
|
||||
autogrant_actions_controller["[control_flag]"] += actiontype
|
||||
for(var/i in occupants)
|
||||
grant_controller_actions(i) //refresh
|
||||
|
||||
/obj/vehicle/proc/grant_action_type_to_mob(actiontype, mob/m)
|
||||
if(isnull(occupants[m]) || !actiontype)
|
||||
return FALSE
|
||||
LAZYINITLIST(occupant_actions[m])
|
||||
if(occupant_actions[m][actiontype])
|
||||
return TRUE
|
||||
var/datum/action/action = generate_action_type(actiontype)
|
||||
action.Grant(m)
|
||||
occupant_actions[m][action.type] = action
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/remove_action_type_from_mob(actiontype, mob/m)
|
||||
if(isnull(occupants[m]) || !actiontype)
|
||||
return FALSE
|
||||
LAZYINITLIST(occupant_actions[m])
|
||||
if(occupant_actions[m][actiontype])
|
||||
var/datum/action/action = occupant_actions[m][actiontype]
|
||||
action.Remove(m)
|
||||
occupant_actions[m] -= actiontype
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/grant_passenger_actions(mob/M)
|
||||
for(var/v in autogrant_actions_passenger)
|
||||
grant_action_type_to_mob(v, M)
|
||||
|
||||
/obj/vehicle/proc/remove_passenger_actions(mob/M)
|
||||
for(var/v in autogrant_actions_passenger)
|
||||
remove_action_type_from_mob(v, M)
|
||||
|
||||
/obj/vehicle/proc/grant_controller_actions(mob/M)
|
||||
if(!istype(M) || isnull(occupants[M]))
|
||||
return FALSE
|
||||
for(var/i in GLOB.bitflags)
|
||||
if(occupants[M] & i)
|
||||
grant_controller_actions_by_flag(M, i)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/remove_controller_actions(mob/M)
|
||||
if(!istype(M) || isnull(occupants[M]))
|
||||
return FALSE
|
||||
for(var/i in GLOB.bitflags)
|
||||
remove_controller_actions_by_flag(M, i)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/grant_controller_actions_by_flag(mob/M, flag)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
for(var/v in autogrant_actions_controller["[flag]"])
|
||||
grant_action_type_to_mob(v, M)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/remove_controller_actions_by_flag(mob/M, flag)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
for(var/v in autogrant_actions_controller["[flag]"])
|
||||
remove_action_type_from_mob(v, M)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/cleanup_actions_for_mob(mob/M)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
for(var/path in occupant_actions[M])
|
||||
stack_trace("Leftover action type [path] in vehicle type [type] for mob type [M.type] - THIS SHOULD NOT BE HAPPENING!")
|
||||
var/datum/action/action = occupant_actions[M][path]
|
||||
action.Remove(M)
|
||||
occupant_actions[M] -= path
|
||||
occupant_actions -= M
|
||||
return TRUE
|
||||
|
||||
//ACTION DATUMS
|
||||
|
||||
/datum/action/vehicle
|
||||
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
|
||||
icon_icon = 'icons/mob/actions/actions_vehicle.dmi'
|
||||
button_icon_state = "vehicle_eject"
|
||||
var/obj/vehicle/vehicle_target
|
||||
|
||||
/datum/action/vehicle/sealed
|
||||
var/obj/vehicle/sealed/vehicle_entered_target
|
||||
|
||||
/datum/action/vehicle/sealed/climb_out
|
||||
name = "Climb Out"
|
||||
desc = "Climb out of your vehicle!"
|
||||
button_icon_state = "car_eject"
|
||||
|
||||
/datum/action/vehicle/sealed/climb_out/Trigger()
|
||||
if(..() && istype(vehicle_entered_target))
|
||||
vehicle_entered_target.mob_try_exit(owner, owner)
|
||||
|
||||
/datum/action/vehicle/ridden
|
||||
var/obj/vehicle/ridden/vehicle_ridden_target
|
||||
|
||||
/datum/action/vehicle/sealed/remove_key
|
||||
name = "Remove key"
|
||||
desc = "Take your key out of the vehicle's ignition"
|
||||
button_icon_state = "car_removekey"
|
||||
|
||||
/datum/action/vehicle/sealed/remove_key/Trigger()
|
||||
vehicle_entered_target.remove_key(owner)
|
||||
|
||||
//CLOWN CAR ACTION DATUMS
|
||||
/datum/action/vehicle/sealed/horn
|
||||
name = "Honk Horn"
|
||||
desc = "Honk your classy horn."
|
||||
button_icon_state = "car_horn"
|
||||
var/hornsound = 'sound/items/carhorn.ogg'
|
||||
var/last_honk_time
|
||||
|
||||
/datum/action/vehicle/sealed/horn/Trigger()
|
||||
if(world.time - last_honk_time > 20)
|
||||
vehicle_entered_target.visible_message("<span class='danger'>[vehicle_entered_target] loudly honks</span>")
|
||||
to_chat(owner, "<span class='notice'>You press the vehicle's horn.</span>")
|
||||
playsound(vehicle_entered_target, hornsound, 75)
|
||||
last_honk_time = world.time
|
||||
|
||||
/datum/action/vehicle/sealed/horn/clowncar/Trigger()
|
||||
if(world.time - last_honk_time > 20)
|
||||
vehicle_entered_target.visible_message("<span class='danger'>[vehicle_entered_target] loudly honks</span>")
|
||||
to_chat(owner, "<span class='notice'>You press the vehicle's horn.</span>")
|
||||
last_honk_time = world.time
|
||||
if(vehicle_target.inserted_key)
|
||||
vehicle_target.inserted_key.attack_self(owner) //The key plays a sound
|
||||
else
|
||||
playsound(vehicle_entered_target, hornsound, 75)
|
||||
|
||||
/datum/action/vehicle/sealed/DumpKidnappedMobs
|
||||
name = "Dump kidnapped mobs"
|
||||
desc = "Dump all objects and people in your car on the floor."
|
||||
button_icon_state = "car_dump"
|
||||
|
||||
/datum/action/vehicle/sealed/DumpKidnappedMobs/Trigger()
|
||||
vehicle_entered_target.visible_message("<span class='danger'>[vehicle_entered_target] starts dumping the people inside of it.</span>")
|
||||
vehicle_entered_target.DumpSpecificMobs(VEHICLE_CONTROL_KIDNAPPED)
|
||||
|
||||
|
||||
/datum/action/vehicle/sealed/RollTheDice
|
||||
name = "Press a colorful button"
|
||||
desc = "Press one of those colorful buttons on your display panel!"
|
||||
button_icon_state = "car_rtd"
|
||||
|
||||
/datum/action/vehicle/sealed/RollTheDice/Trigger()
|
||||
if(istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar))
|
||||
var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target
|
||||
C.RollTheDice(owner)
|
||||
//VEHICLE DEFAULT HANDLING
|
||||
/obj/vehicle/proc/generate_actions()
|
||||
return
|
||||
|
||||
/obj/vehicle/proc/generate_action_type(actiontype)
|
||||
var/datum/action/vehicle/A = new actiontype
|
||||
if(!istype(A))
|
||||
return
|
||||
A.vehicle_target = src
|
||||
return A
|
||||
|
||||
/obj/vehicle/proc/initialize_passenger_action_type(actiontype)
|
||||
autogrant_actions_passenger += actiontype
|
||||
for(var/i in occupants)
|
||||
grant_passenger_actions(i) //refresh
|
||||
|
||||
/obj/vehicle/proc/initialize_controller_action_type(actiontype, control_flag)
|
||||
LAZYINITLIST(autogrant_actions_controller["[control_flag]"])
|
||||
autogrant_actions_controller["[control_flag]"] += actiontype
|
||||
for(var/i in occupants)
|
||||
grant_controller_actions(i) //refresh
|
||||
|
||||
/obj/vehicle/proc/grant_action_type_to_mob(actiontype, mob/m)
|
||||
if(isnull(occupants[m]) || !actiontype)
|
||||
return FALSE
|
||||
LAZYINITLIST(occupant_actions[m])
|
||||
if(occupant_actions[m][actiontype])
|
||||
return TRUE
|
||||
var/datum/action/action = generate_action_type(actiontype)
|
||||
action.Grant(m)
|
||||
occupant_actions[m][action.type] = action
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/remove_action_type_from_mob(actiontype, mob/m)
|
||||
if(isnull(occupants[m]) || !actiontype)
|
||||
return FALSE
|
||||
LAZYINITLIST(occupant_actions[m])
|
||||
if(occupant_actions[m][actiontype])
|
||||
var/datum/action/action = occupant_actions[m][actiontype]
|
||||
action.Remove(m)
|
||||
occupant_actions[m] -= actiontype
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/grant_passenger_actions(mob/M)
|
||||
for(var/v in autogrant_actions_passenger)
|
||||
grant_action_type_to_mob(v, M)
|
||||
|
||||
/obj/vehicle/proc/remove_passenger_actions(mob/M)
|
||||
for(var/v in autogrant_actions_passenger)
|
||||
remove_action_type_from_mob(v, M)
|
||||
|
||||
/obj/vehicle/proc/grant_controller_actions(mob/M)
|
||||
if(!istype(M) || isnull(occupants[M]))
|
||||
return FALSE
|
||||
for(var/i in GLOB.bitflags)
|
||||
if(occupants[M] & i)
|
||||
grant_controller_actions_by_flag(M, i)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/remove_controller_actions(mob/M)
|
||||
if(!istype(M) || isnull(occupants[M]))
|
||||
return FALSE
|
||||
for(var/i in GLOB.bitflags)
|
||||
remove_controller_actions_by_flag(M, i)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/grant_controller_actions_by_flag(mob/M, flag)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
for(var/v in autogrant_actions_controller["[flag]"])
|
||||
grant_action_type_to_mob(v, M)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/remove_controller_actions_by_flag(mob/M, flag)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
for(var/v in autogrant_actions_controller["[flag]"])
|
||||
remove_action_type_from_mob(v, M)
|
||||
return TRUE
|
||||
|
||||
/obj/vehicle/proc/cleanup_actions_for_mob(mob/M)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
for(var/path in occupant_actions[M])
|
||||
stack_trace("Leftover action type [path] in vehicle type [type] for mob type [M.type] - THIS SHOULD NOT BE HAPPENING!")
|
||||
var/datum/action/action = occupant_actions[M][path]
|
||||
action.Remove(M)
|
||||
occupant_actions[M] -= path
|
||||
occupant_actions -= M
|
||||
return TRUE
|
||||
|
||||
//ACTION DATUMS
|
||||
|
||||
/datum/action/vehicle
|
||||
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
|
||||
icon_icon = 'icons/mob/actions/actions_vehicle.dmi'
|
||||
button_icon_state = "vehicle_eject"
|
||||
var/obj/vehicle/vehicle_target
|
||||
|
||||
/datum/action/vehicle/sealed
|
||||
var/obj/vehicle/sealed/vehicle_entered_target
|
||||
|
||||
/datum/action/vehicle/sealed/climb_out
|
||||
name = "Climb Out"
|
||||
desc = "Climb out of your vehicle!"
|
||||
button_icon_state = "car_eject"
|
||||
|
||||
/datum/action/vehicle/sealed/climb_out/Trigger()
|
||||
if(..() && istype(vehicle_entered_target))
|
||||
vehicle_entered_target.mob_try_exit(owner, owner)
|
||||
|
||||
/datum/action/vehicle/ridden
|
||||
var/obj/vehicle/ridden/vehicle_ridden_target
|
||||
|
||||
/datum/action/vehicle/sealed/remove_key
|
||||
name = "Remove key"
|
||||
desc = "Take your key out of the vehicle's ignition"
|
||||
button_icon_state = "car_removekey"
|
||||
|
||||
/datum/action/vehicle/sealed/remove_key/Trigger()
|
||||
vehicle_entered_target.remove_key(owner)
|
||||
|
||||
//CLOWN CAR ACTION DATUMS
|
||||
/datum/action/vehicle/sealed/horn
|
||||
name = "Honk Horn"
|
||||
desc = "Honk your classy horn."
|
||||
button_icon_state = "car_horn"
|
||||
var/hornsound = 'sound/items/carhorn.ogg'
|
||||
var/last_honk_time
|
||||
|
||||
/datum/action/vehicle/sealed/horn/Trigger()
|
||||
if(world.time - last_honk_time > 20)
|
||||
vehicle_entered_target.visible_message("<span class='danger'>[vehicle_entered_target] loudly honks</span>")
|
||||
to_chat(owner, "<span class='notice'>You press the vehicle's horn.</span>")
|
||||
playsound(vehicle_entered_target, hornsound, 75)
|
||||
last_honk_time = world.time
|
||||
|
||||
/datum/action/vehicle/sealed/horn/clowncar/Trigger()
|
||||
if(world.time - last_honk_time > 20)
|
||||
vehicle_entered_target.visible_message("<span class='danger'>[vehicle_entered_target] loudly honks</span>")
|
||||
to_chat(owner, "<span class='notice'>You press the vehicle's horn.</span>")
|
||||
last_honk_time = world.time
|
||||
if(vehicle_target.inserted_key)
|
||||
vehicle_target.inserted_key.attack_self(owner) //The key plays a sound
|
||||
else
|
||||
playsound(vehicle_entered_target, hornsound, 75)
|
||||
|
||||
/datum/action/vehicle/sealed/DumpKidnappedMobs
|
||||
name = "Dump kidnapped mobs"
|
||||
desc = "Dump all objects and people in your car on the floor."
|
||||
button_icon_state = "car_dump"
|
||||
|
||||
/datum/action/vehicle/sealed/DumpKidnappedMobs/Trigger()
|
||||
vehicle_entered_target.visible_message("<span class='danger'>[vehicle_entered_target] starts dumping the people inside of it.</span>")
|
||||
vehicle_entered_target.DumpSpecificMobs(VEHICLE_CONTROL_KIDNAPPED)
|
||||
|
||||
|
||||
/datum/action/vehicle/sealed/RollTheDice
|
||||
name = "Press a colorful button"
|
||||
desc = "Press one of those colorful buttons on your display panel!"
|
||||
button_icon_state = "car_rtd"
|
||||
|
||||
/datum/action/vehicle/sealed/RollTheDice/Trigger()
|
||||
if(istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar))
|
||||
var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target
|
||||
C.RollTheDice(owner)
|
||||
|
||||
Reference in New Issue
Block a user