mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 03:02:38 +00:00
69 lines
2.4 KiB
Plaintext
69 lines
2.4 KiB
Plaintext
/// Component given to mobs that can mine when moving
|
|
/datum/component/proficient_miner
|
|
/// Toolspeed for mining, 0 will cause it to instamine rock
|
|
var/mining_speed = 0
|
|
/// Should we pass the do_after visuals to our rider if we are a mob?
|
|
var/pass_driver = FALSE
|
|
/// Last tick when we bumpmined. Prevents diagonal bumpnining being thrice as fast as normal
|
|
var/last_bumpmine_tick = -1
|
|
|
|
/datum/component/proficient_miner/Initialize(mining_speed = 0, pass_driver = FALSE)
|
|
if (!ismovable(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
src.mining_speed = mining_speed
|
|
src.pass_driver = pass_driver
|
|
|
|
/datum/component/proficient_miner/RegisterWithParent()
|
|
RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump))
|
|
|
|
/datum/component/proficient_miner/UnregisterFromParent()
|
|
UnregisterSignal(parent, COMSIG_MOVABLE_BUMP)
|
|
|
|
/datum/component/proficient_miner/proc/on_bump(atom/movable/source, atom/target)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!ismineralturf(target) || last_bumpmine_tick == world.time)
|
|
return
|
|
|
|
var/mob/living/user = null
|
|
if(isliving(parent))
|
|
user = parent
|
|
if(user.stat != CONSCIOUS)
|
|
return
|
|
|
|
var/turf/closed/mineral/mineral_wall = target
|
|
if(istype(mineral_wall, /turf/closed/mineral/gibtonite))
|
|
var/turf/closed/mineral/gibtonite/gibtonite_wall = mineral_wall
|
|
if(gibtonite_wall.stage != GIBTONITE_UNSTRUCK)
|
|
return
|
|
|
|
if(user && mining_speed > 0)
|
|
INVOKE_ASYNC(src, PROC_REF(slow_mine), user, target)
|
|
return
|
|
|
|
last_bumpmine_tick = world.time
|
|
mineral_wall.gets_drilled(source)
|
|
|
|
/datum/component/proficient_miner/proc/slow_mine(mob/living/user, turf/closed/mineral/mineral_wall)
|
|
if(TIMER_COOLDOWN_RUNNING(mineral_wall, REF(user))) //prevents mining turfs in progress
|
|
return
|
|
|
|
var/mining_delay = mineral_wall.tool_mine_speed * mining_speed
|
|
TIMER_COOLDOWN_START(mineral_wall, REF(user), mining_delay)
|
|
var/static/list/mine_sounds = list('sound/effects/pickaxe/picaxe1.ogg', 'sound/effects/pickaxe/picaxe2.ogg', 'sound/effects/pickaxe/picaxe3.ogg')
|
|
playsound(user, pick(mine_sounds), 50)
|
|
|
|
var/mob/living/driver = null
|
|
if (pass_driver && length(user.buckled_mobs))
|
|
driver = user.buckled_mobs[1]
|
|
|
|
if(!do_after(user, mining_delay, mineral_wall, bar_override = driver))
|
|
TIMER_COOLDOWN_END(mineral_wall, REF(user)) //if we fail we can start again immediately
|
|
return
|
|
|
|
if (mining_delay > MIN_TOOL_SOUND_DELAY)
|
|
playsound(user, pick(mine_sounds), 50)
|
|
|
|
if(istype(mineral_wall))
|
|
mineral_wall.gets_drilled(driver || user)
|