void button_wait(entity this);
void button_return(entity this);
+// in case button is deactivated by a relay_deactivate while it pressed down
+// set both fields to -1 in button_return!!
+.float wait_remaining;
+.float activation_time;
+
+void button_setactive(entity this, int astate)
+{
+ int oldstate = this.active;
+ if (astate == ACTIVE_TOGGLE)
+ {
+ if (this.active == ACTIVE_ACTIVE)
+ this.active = ACTIVE_NOT;
+ else
+ this.active = ACTIVE_ACTIVE;
+ }
+ else
+ this.active = astate;
+
+ if (this.active == ACTIVE_ACTIVE && oldstate == ACTIVE_NOT)
+ {
+ // button was deactivated while it was pressed
+ if (this.wait_remaining >= 0)
+ {
+ this.nextthink = this.wait_remaining + this.ltime;
+ setthink(this, button_return);
+ }
+ }
+ else if (this.active == ACTIVE_NOT && oldstate == ACTIVE_ACTIVE)
+ {
+ // check if button is in pressed state
+ if (this.activation_time >= 0)
+ {
+ this.wait_remaining = this.wait - (time - this.activation_time);
+ }
+ }
+}
+
void button_wait(entity this)
{
this.state = STATE_TOP;
void button_return(entity this)
{
+ if (this.active != ACTIVE_ACTIVE)
+ {
+ return;
+ }
this.state = STATE_DOWN;
SUB_CalcMove (this, this.pos1, TSPEED_LINEAR, this.speed, button_done);
this.frame = 0; // use normal textures
- if (this.health)
+ if (GetResourceAmount(this, RESOURCE_HEALTH))
this.takedamage = DAMAGE_YES; // can be shot again
+ this.wait_remaining = -1;
+ this.activation_time = -1;
}
void button_fire(entity this)
{
- this.health = this.max_health;
+ SetResourceAmountExplicit(this, RESOURCE_HEALTH, this.max_health);
this.takedamage = DAMAGE_NO; // will be reset upon return
if (this.state == STATE_UP || this.state == STATE_TOP)
return;
+ this.activation_time = time;
+
if (this.noise != "")
_sound (this, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
void button_reset(entity this)
{
- this.health = this.max_health;
+ SetResourceAmountExplicit(this, RESOURCE_HEALTH, this.max_health);
setorigin(this, this.pos1);
this.frame = 0; // use normal textures
this.state = STATE_BOTTOM;
this.velocity = '0 0 0';
setthink(this, func_null);
this.nextthink = 0;
- if (this.health)
+ if (GetResourceAmount(this, RESOURCE_HEALTH))
this.takedamage = DAMAGE_YES; // can be shot again
}
void button_touch(entity this, entity toucher)
{
+ if (this.active != ACTIVE_ACTIVE)
+ return;
if (!toucher)
return;
if (!toucher.iscreature)
void button_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
{
+ if (this.active != ACTIVE_ACTIVE)
+ return;
if(this.spawnflags & NOSPLASH)
if(!(DEATH_ISSPECIAL(deathtype)) && (deathtype & HITTYPE_SPLASH))
return;
if (this.spawnflags & BUTTON_DONTACCUMULATEDMG)
{
- if (this.health <= damage)
+ if (GetResourceAmount(this, RESOURCE_HEALTH) <= damage)
{
this.enemy = attacker;
button_fire(this);
}
else
{
- this.health = this.health - damage;
- if (this.health <= 0)
+ TakeResource(this, RESOURCE_HEALTH, damage);
+ if (GetResourceAmount(this, RESOURCE_HEALTH) <= 0)
{
this.enemy = attacker;
button_fire(this);
// if (this.health == 0) // all buttons are now shootable
// this.health = 10;
- if (this.health)
+ if (GetResourceAmount(this, RESOURCE_HEALTH))
{
- this.max_health = this.health;
+ this.max_health = GetResourceAmount(this, RESOURCE_HEALTH);
this.event_damage = button_damage;
this.takedamage = DAMAGE_YES;
}
if (!this.lip)
this.lip = 4;
+ this.wait_remaining = -1;
+ this.activation_time = -1;
+
if(this.noise != "")
precache_sound(this.noise);
this.active = ACTIVE_ACTIVE;
+ this.draggable = drag_undraggable;
+
+ this.setactive = button_setactive;
this.pos1 = this.origin;
this.pos2 = this.pos1 + this.movedir*(fabs(this.movedir*this.size) - this.lip);