Skip to content

Commit

Permalink
fancy_deletion_timer_add (#1400)
Browse files Browse the repository at this point in the history
  • Loading branch information
Ganza9991 authored Jan 15, 2025
1 parent 2a8381d commit f2ed747
Show file tree
Hide file tree
Showing 6 changed files with 272 additions and 0 deletions.
97 changes: 97 additions & 0 deletions mod_celadon/fancy_deletion_timer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@

#### Список PRов

- https://github.com/CeladonSS13/Shiptest/pulls/#####
<!--
Ссылки на PRы, связанные с модом:
- Создание
- Большие изменения
-->

<!-- Название мода. Не важно на русском или на английском. -->
## Fancy Deletion Timer

ID мода: CELADON_FANCY_DELETION_TIMER
<!--
Название модпака прописными буквами, СОЕДИНЁННЫМИ_ПОДЧЁРКИВАНИЕМ,
которое ты будешь использовать для обозначения файлов.
При запуске скрипта выставляется автоматически.
Приставка CELADON гарантирует уникальность
модпака. Этот ID будет использоваться для обозначения
изменений в кор коде, если того потребуется.
-->

### Описание мода

Добавляет компонент, отвечающий за удаление атомов.
<!--
Что он делает, что добавляет: что, куда, зачем и почему - всё здесь.
А также любая полезная информация.
-->

### Используется в других проектах?
- Нет
<!--
ВНИМАНИЕ!
Заполняется другими авторами, кто использует этот модпак или
его часть в других модпаках! Для Автора модпака внимательно
отслеживать данный пункт при изменении своего кода!
Пример заполнения: `Используется часть кода для модпака EXAMP_EXAM`
-->

### Изменения *кор кода*

- Отсутствуют
<!--
Если вы редактировали какие-либо процедуры или переменные в кор коде,
они должны быть указаны здесь.
Нужно указать и файл, и процедуры/переменные.
Изменений нет - напиши "Отсутствуют"
Примеры: `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var`
-->

### Оверрайды

- Отсутствуют
<!--
Если ты добавлял новый модульный оверрайд, его нужно указать здесь.
Здесь указываются оверрайды в твоём моде и папке `_master_files`
Изменений нет - напиши "Отсутствуют"
Примеры:
- `mods/_master_files/sound/my_cool_sound.ogg`
- `mods/_master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var`
-->

### Дефайны

- Отсутствуют
<!--
Если требовалось добавить какие-либо дефайны, укажи файлы,
в которые ты их добавил, а также перечисли имена.
И то же самое, если ты используешь дефайны, определённые другим модом.
Не используешь - напиши "Отсутствуют"
Примеры: `code/__defines/~mod_celadon/fancy_deletion_timer.dm`: `FANCY_DELETION_TIMER_SPEED_MULTIPLIER`, `FANCY_DELETION_TIMER_SPEED_BASE`
-->

### Используемые файлы, не содержащиеся в модпаке

- Отсутствуют
<!--
Будь то немодульный файл или модульный файл, который не содержится в папке,
принадлежащей этому конкретному моду, он должен быть упомянут здесь.
Хорошими примерами являются иконки или звуки, которые используются одновременно
несколькими модулями, или что-либо подобное.
Примеры: `mods/_master_files/icons/obj/alien.dmi`
-->

### Авторы

Ganza9991
<!--
Здесь находится твой никнейм
Если работал совместно - никнеймы тех, кто помогал.
В случае порта чего-либо должна быть ссылка на источник.
-->
27 changes: 27 additions & 0 deletions mod_celadon/fancy_deletion_timer/_fancy_deletion_timer.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/// name - название модпака. Используется для поиска других модпаков в init.
/// desc - описание для модпака. Может использоваться для списка глаголов модпака в качестве описания.
/// author - автор(ы) этого модпака.

/datum/modpack/fancy_deletion_timer
name = "Fancy Deletion Timer"
desc = "Добавляет компонент, отвечающий за удаление атомов."
author = "Ganza9991"

/// Эти проки нужны, для того чтобы инициализировать датумы в определенный момент времени
/// сборки билда. Инициализация обновляет данные в билде повторно, перезаписывая новыми значениями
/// из модпака. Но иногда, сама инциализация есть и вызывается в кор коде в определенный момент, и
/// тогда такие проки не нужны и вовсе. Также проки не нужны если в модпаке только объекты находятся.
/// Если эти конструкции не нужны, просто закоментируй их!
/// (можешь использовать все три, но запуск билда увеличится на 0.1 сек, за каждый датум в модпаке)

// Инициализация ДО
/datum/modpack/fancy_deletion_timer/pre_initialize()
. = ..()

// Инициализация ВОВРЕМЯ
/datum/modpack/fancy_deletion_timer/initialize()
. = ..()

// Инициализация ПОСЛЕ
/datum/modpack/fancy_deletion_timer/post_initialize()
. = ..()
8 changes: 8 additions & 0 deletions mod_celadon/fancy_deletion_timer/_fancy_deletion_timer.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef MODPACK_CELADON_FANCY_DELETION_TIMER
#define MODPACK_CELADON_FANCY_DELETION_TIMER

#include "_fancy_deletion_timer.dm"
#include "code/fancy_deletion_timer.dm"
#include "code/meteorcarp.dm"

#endif
128 changes: 128 additions & 0 deletions mod_celadon/fancy_deletion_timer/code/fancy_deletion_timer.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/*
Fancy Timer
Component that handles fancy deleting with timer
Can contain an atom which will spawn upon deletion.
Intended use with atoms only
*/

/datum/component/fancy_deleting_timer

///In seconds, so dont use time defines here
var/timer
var/is_ticking

/// How many times did we failed deleting the parent when timer ended
var/times_we_failed_deleting
var/deleting_attempts = 5
var/ignore_client_in_sight = FALSE

/// If TRUE works as whitelist; checks for THESE turfs to be deleted on. If FALSE works as blacklist; will NOT be deleted on these turfs upon check
var/turf_whitelist = TRUE
var/list/turf/T = list()

/// Atom to spawn upon deletion of parent
var/atom/effect
/// Where we will spawn our effect. Handles: "loc"; "turf"
var/effect_place

var/atom/A

//_________________HELPER PROCS______________________
/// Handles the timer start. Not in initialize in cases when you want to add a timer but dont want to start it right away.
/datum/component/fancy_deleting_timer/proc/start_the_timer(time)
if(!A && parent)
A = parent
timer = time ? time : timer
is_ticking = TRUE
if(!active_timers)
addtimer(CALLBACK(src, PROC_REF(tick_tock)), 1 SECONDS)
return is_ticking

/datum/component/fancy_deleting_timer/proc/stop_the_timer()
is_ticking = FALSE
LAZYNULL(active_timers)
return

/datum/component/fancy_deleting_timer/proc/delete_the_timer()
Destroy(0,1)

//___________________________________________________

/datum/component/fancy_deleting_timer/proc/tick_tock()
addtimer(CALLBACK(src, PROC_REF(tick_tock)), 1 SECONDS)
if(!timer)
batteries_out()
return
else if(is_ticking)
timer--

/datum/component/fancy_deleting_timer/proc/spawn_effect()
if(effect)
switch(effect_place)
if("loc")
effect_place = A.loc
// if("turf")
// effect_place = get_turf(parent)
else
effect_place = get_turf(parent)
new effect(effect_place)

/datum/component/fancy_deleting_timer/proc/handle_list()
if(T)
switch(turf_whitelist)
if(TRUE) // whitelist
if(!is_type_in_list(get_turf(parent), T))
return FALSE
else // blacklist
if(is_type_in_list(get_turf(parent), T))
return FALSE
return TRUE

/datum/component/fancy_deleting_timer/Initialize(...)
. = ..()

/datum/component/fancy_deleting_timer/proc/batteries_out()
if(handle_list() && clients_in_sight())
spawn_effect()
qdel(parent)
else if(times_we_failed_deleting >= deleting_attempts)
delete_the_timer()
if(A)
message_admins("Fancy Timer in '[A]' in '[get_area_name(A)]' called to deletion [times_we_failed_deleting] times, but did not succeded. Deleting the Fancy Timer. [ADMIN_JMP(A)]")
else
timer += 30
times_we_failed_deleting++

/datum/component/fancy_deleting_timer/proc/clients_in_sight()
for(var/mob/living/L in view(parent))
if(L.client)
return FALSE
return TRUE

//_________________ vv href ______________________

#define VV_HK_START_TIMER "start_the_timer"
#define VV_HK_STOP_TIMER "stop_the_timer"
#define VV_HK_DELETE_TIMER "delete_the_timer"

/datum/component/fancy_deleting_timer/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("", "--- Fancy Timer component ---")
VV_DROPDOWN_OPTION(VV_HK_START_TIMER, "Start the timer")
VV_DROPDOWN_OPTION(VV_HK_STOP_TIMER, "Stop the timer")
VV_DROPDOWN_OPTION(VV_HK_DELETE_TIMER, "Delete the timer")

/datum/component/fancy_deleting_timer/vv_do_topic(list/href_list)
. = ..()
if(href_list[VV_HK_START_TIMER])
var/temp = input(usr, "Set the timer to... (in seconds)", "Set timer") as num|null
start_the_timer(temp)
to_chat(usr, "Timer on [parent] has been set to [timer] seconds.")
if(href_list[VV_HK_STOP_TIMER])
stop_the_timer()
to_chat(usr, "Timer on [parent] stopped at [timer] seconds.")
if(href_list[VV_HK_DELETE_TIMER])
delete_the_timer()
to_chat(usr, "Timer on [parent] is deleted.")
11 changes: 11 additions & 0 deletions mod_celadon/fancy_deletion_timer/code/meteorcarp.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/obj/effect/meteor/carp/make_debris()
for(var/throws = dropamt, throws > 0, throws--)
var/mob/living/thing_to_spawn = pick(meteordrop)
thing_to_spawn = new thing_to_spawn(get_turf(src))

thing_to_spawn.AddComponent(/datum/component/fancy_deleting_timer)
var/datum/component/fancy_deleting_timer/fdt = thing_to_spawn.GetComponent(/datum/component/fancy_deleting_timer)
fdt.turf_whitelist = 1
fdt.T = list(/turf/open/space)
fdt.parent = thing_to_spawn
fdt.start_the_timer(360)
1 change: 1 addition & 0 deletions mod_celadon/mod_celadon.dme
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "overload/_overload.dme"
#include "clumsy_table/_clumsy_table.dme"
#include "quirks/_quirks.dme"
#include "fancy_deletion_timer/_fancy_deletion_timer.dme"

// --- ICONS --- //
#include "parallax/_parallax.dme"
Expand Down

0 comments on commit f2ed747

Please sign in to comment.