Pixel-Composer/scripts/node_VFX_spawner/node_VFX_spawner.gml

108 lines
3.2 KiB
Plaintext
Raw Normal View History

2023-02-28 09:43:01 +01:00
function Node_VFX_Spawner(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y, _group) constructor {
2022-12-13 09:20:36 +01:00
name = "Spawner";
2023-02-14 05:32:32 +01:00
color = COLORS.node_blend_vfx;
icon = THEME.vfx;
2022-12-13 09:20:36 +01:00
2023-06-13 14:42:06 +02:00
attributes.Output_pool = false;
2023-03-13 10:45:56 +01:00
2023-02-14 05:32:32 +01:00
inputs[| input_len + 0] = nodeValue("Spawn trigger", self, JUNCTION_CONNECT.input, VALUE_TYPE.node, false)
2022-12-16 09:18:09 +01:00
.setVisible(true, true);
2022-12-13 09:20:36 +01:00
2023-02-14 05:32:32 +01:00
inputs[| input_len + 1] = nodeValue("Step interval", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 1, "How often the 'on step' event is triggered.\nWith 1 being trigger every frame, 2 means triggered once every 2 frames.");
2022-12-13 09:20:36 +01:00
2023-03-13 10:45:56 +01:00
outputs[| 0] = nodeValue("Particles", self, JUNCTION_CONNECT.output, VALUE_TYPE.particle, [] );
2023-02-14 05:32:32 +01:00
outputs[| 1] = nodeValue("On create", self, JUNCTION_CONNECT.output, VALUE_TYPE.node, noone );
outputs[| 2] = nodeValue("On step", self, JUNCTION_CONNECT.output, VALUE_TYPE.node, noone );
outputs[| 3] = nodeValue("On destroy", self, JUNCTION_CONNECT.output, VALUE_TYPE.node, noone );
2022-12-13 09:20:36 +01:00
2022-12-16 09:18:09 +01:00
array_insert(input_display_list, 0, ["Trigger", true], input_len + 0, input_len + 1);
2022-12-13 09:20:36 +01:00
2023-03-28 06:58:28 +02:00
UPDATE_PART_FORWARD
2023-01-17 08:11:55 +01:00
2023-03-07 14:29:47 +01:00
static onUpdate = function() {
2023-02-23 07:02:19 +01:00
RETURN_ON_REST
2023-07-06 19:49:16 +02:00
if(PROJECT.animator.current_frame == 0)
2023-02-23 07:02:19 +01:00
reset();
2023-07-06 19:49:16 +02:00
runVFX(PROJECT.animator.current_frame);
2023-03-13 10:45:56 +01:00
2023-06-13 14:42:06 +02:00
if(attributes.Output_pool) {
2023-03-13 10:45:56 +01:00
outputs[| 0].setValue(parts);
return;
} else {
var _parts = [];
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(parts); i < n; i++ ) {
2023-03-13 10:45:56 +01:00
if(!parts[i].active) continue;
array_push(_parts, parts[i]);
}
outputs[| 0].setValue(_parts);
}
2023-02-23 07:02:19 +01:00
}
2022-12-16 09:18:09 +01:00
static onSpawn = function(_time, part) {
part.step_int = inputs[| input_len + 1].getValue(_time);
2022-12-13 09:20:36 +01:00
}
2023-01-17 08:11:55 +01:00
static onPartCreate = function(part) {
var vt = outputs[| 1];
if(ds_list_empty(vt.value_to)) return;
2022-12-16 09:18:09 +01:00
var pv = part.getPivot();
2023-01-17 08:11:55 +01:00
for( var i = 0; i < ds_list_size(inputs); i++ )
current_data[i] = inputs[| i].getValue();
2022-12-13 09:20:36 +01:00
2022-12-16 09:18:09 +01:00
for( var i = 0; i < ds_list_size(vt.value_to); i++ ) {
var _n = vt.value_to[| i];
if(_n.value_from != vt) continue;
_n.node.spawn(, pv);
}
2022-12-13 09:20:36 +01:00
}
2022-12-16 09:18:09 +01:00
static onPartStep = function(part) {
var vt = outputs[| 2];
2023-01-17 08:11:55 +01:00
if(ds_list_empty(vt.value_to)) return;
var pv = part.getPivot();
for( var i = 0; i < ds_list_size(inputs); i++ )
current_data[i] = inputs[| i].getValue();
2022-12-16 09:18:09 +01:00
for( var i = 0; i < ds_list_size(vt.value_to); i++ ) {
var _n = vt.value_to[| i];
if(_n.value_from != vt) continue;
_n.node.spawn(, pv);
2022-12-13 09:20:36 +01:00
}
}
2022-12-16 09:18:09 +01:00
static onPartDestroy = function(part) {
var vt = outputs[| 3];
2023-01-17 08:11:55 +01:00
if(ds_list_empty(vt.value_to)) return;
var pv = part.getPivot();
for( var i = 0; i < ds_list_size(inputs); i++ )
current_data[i] = inputs[| i].getValue();
2022-12-16 09:18:09 +01:00
for( var i = 0; i < ds_list_size(vt.value_to); i++ ) {
var _n = vt.value_to[| i];
if(_n.value_from != vt) continue;
_n.node.spawn(, pv);
2022-12-13 09:20:36 +01:00
}
}
2023-03-05 07:16:44 +01:00
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) {
2022-12-16 09:18:09 +01:00
var spr = inputs[| 0].getValue();
2022-12-13 09:20:36 +01:00
2022-12-16 09:18:09 +01:00
if(spr == 0) {
2023-02-14 05:32:32 +01:00
if(!is_surface(def_surface))
return;
2022-12-16 09:18:09 +01:00
spr = def_surface;
2022-12-13 09:20:36 +01:00
}
2022-12-16 09:18:09 +01:00
if(is_array(spr))
spr = spr[safe_mod(round(current_time / 100), array_length(spr))];
2022-12-13 09:20:36 +01:00
2022-12-16 09:18:09 +01:00
var cx = xx + w * _s / 2;
var cy = yy + h * _s / 2;
2023-09-08 21:37:36 +02:00
var ss = min((w - 8) / surface_get_width_safe(spr), (h - 8) / surface_get_height_safe(spr)) * _s;
2022-12-16 09:18:09 +01:00
draw_surface_align(spr, cx, cy, ss, fa_center, fa_center);
2022-12-13 09:20:36 +01:00
}
}