X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ffunc%2Fdoor.qc;h=99ee91f827c0673f4496244eab15704853ab897d;hb=f41d9f31538bef0259d2b2c74536bb977901f99d;hp=8d19a740c26dbd6b6c89dccd0fab7b874abc454b;hpb=8da45596c76bb645e864b4ec8ff5a3ee13bbf27c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/func/door.qc b/qcsrc/common/triggers/func/door.qc index 8d19a740c..99ee91f82 100644 --- a/qcsrc/common/triggers/func/door.qc +++ b/qcsrc/common/triggers/func/door.qc @@ -31,23 +31,23 @@ void door_blocked() #ifdef SVQC && (other.takedamage != DAMAGE_NO) #elif defined(CSQC) - && !PHYS_DEAD(other) + && !IS_DEAD(other) #endif ) { // KIll Kill Kill!! #ifdef SVQC - Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0'); #endif } else { #ifdef SVQC if((self.dmg) && (other.takedamage == DAMAGE_YES)) // Shall we bite? - Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0'); #endif // don't change direction for dead or dying stuff - if(PHYS_DEAD(other) + if(IS_DEAD(other) #ifdef SVQC && (other.takedamage == DAMAGE_NO) #endif @@ -78,7 +78,7 @@ void door_blocked() { //gib dying stuff just to make sure if((self.dmg) && (other.takedamage != DAMAGE_NO)) // Shall we bite? - Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0'); } #endif } @@ -87,7 +87,7 @@ void door_blocked() void door_hit_top() {SELFPARAM(); if (self.noise1 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); self.state = STATE_TOP; if (self.spawnflags & DOOR_TOGGLE) return; // don't come down automatically @@ -104,14 +104,14 @@ void door_hit_top() void door_hit_bottom() {SELFPARAM(); if (self.noise1 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); self.state = STATE_BOTTOM; } void door_go_down() {SELFPARAM(); if (self.noise2 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); if (self.max_health) { self.takedamage = DAMAGE_YES; @@ -134,7 +134,7 @@ void door_go_up() } if (self.noise2 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); self.state = STATE_UP; SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, door_hit_top); @@ -154,61 +154,56 @@ ACTIVATION FUNCTIONS ============================================================================= */ -float door_check_keys(void) -{SELFPARAM(); - local entity door; - - - if (self.owner) - door = self.owner; - else - door = self; +bool door_check_keys(entity door, entity player) +{ + if(door.owner) + door = door.owner; // no key needed - if (!door.itemkeys) + if(!door.itemkeys) return true; // this door require a key // only a player can have a key - if (!IS_PLAYER(other)) + if(!IS_PLAYER(player)) return false; -#ifdef SVQC - if (item_keys_usekey(door, other)) - { - // some keys were used - if (other.key_door_messagetime <= time) - { + int valid = (door.itemkeys & player.itemkeys); + door.itemkeys &= ~valid; // only some of the needed keys were given - play2(other, "misc/talk.wav"); - Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(door.itemkeys)); - other.key_door_messagetime = time + 2; - } + if(!door.itemkeys) + { +#ifdef SVQC + play2(player, SND(TALK)); + Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_DOOR_UNLOCKED); +#endif + return true; } - else + + if(!valid) { - // no keys were used - if (other.key_door_messagetime <= time) +#ifdef SVQC + if(player.key_door_messagetime <= time) { - play2(other, "misc/talk.wav"); - Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(door.itemkeys)); - - other.key_door_messagetime = time + 2; + play2(player, door.noise3); + Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(door.itemkeys)); + player.key_door_messagetime = time + 2; } - } #endif + return false; + } - if (door.itemkeys) - { + // door needs keys the player doesn't have #ifdef SVQC - // door is now unlocked - play2(other, "misc/talk.wav"); - Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_UNLOCKED); -#endif - return true; + if(player.key_door_messagetime <= time) + { + play2(player, door.noise3); + Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(door.itemkeys)); + player.key_door_messagetime = time + 2; } - else - return false; +#endif + + return false; } void door_fire() @@ -298,6 +293,7 @@ void door_damage(entity inflictor, entity attacker, float damage, int deathtype, } } +.float door_finished; /* ================ @@ -311,17 +307,17 @@ void door_touch() {SELFPARAM(); if (!IS_PLAYER(other)) return; - if (self.owner.attack_finished_single > time) + if (self.owner.door_finished > time) return; - self.owner.attack_finished_single = time + 2; + self.owner.door_finished = time + 2; #ifdef SVQC if (!(self.owner.dmg) && (self.owner.message != "")) { if (IS_CLIENT(other)) centerprint(other, self.owner.message); - play2(other, "misc/talk.wav"); + play2(other, self.owner.noise); } #endif } @@ -331,7 +327,7 @@ void door_generic_plat_blocked() if((self.spawnflags & 8) && (other.takedamage != DAMAGE_NO)) { // KIll Kill Kill!! #ifdef SVQC - Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0'); #endif } else @@ -339,11 +335,11 @@ void door_generic_plat_blocked() #ifdef SVQC if((self.dmg) && (other.takedamage == DAMAGE_YES)) // Shall we bite? - Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0'); #endif //Dont chamge direction for dead or dying stuff - if(PHYS_DEAD(other) && (other.takedamage == DAMAGE_NO)) + if(IS_DEAD(other) && (other.takedamage == DAMAGE_NO)) { if (self.wait >= 0) { @@ -358,7 +354,7 @@ void door_generic_plat_blocked() { //gib dying stuff just to make sure if((self.dmg) && (other.takedamage != DAMAGE_NO)) // Shall we bite? - Damage (other, self, self, 10000, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + Damage (other, self, self, 10000, DEATH_HURTTRIGGER.m_id, other.origin, '0 0 0'); } #endif } @@ -367,7 +363,7 @@ void door_generic_plat_blocked() void door_rotating_hit_top() {SELFPARAM(); if (self.noise1 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); self.state = STATE_TOP; if (self.spawnflags & DOOR_TOGGLE) return; // don't come down automatically @@ -378,7 +374,7 @@ void door_rotating_hit_top() void door_rotating_hit_bottom() {SELFPARAM(); if (self.noise1 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); if (self.lip==666) // self.lip is used to remember reverse opening direction for door_rotating { self.pos2 = '0 0 0' - self.pos2; @@ -390,7 +386,7 @@ void door_rotating_hit_bottom() void door_rotating_go_down() {SELFPARAM(); if (self.noise2 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); if (self.max_health) { self.takedamage = DAMAGE_YES; @@ -412,7 +408,7 @@ void door_rotating_go_up() return; } if (self.noise2 != "") - sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); + _sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); self.state = STATE_UP; SUB_CalcAngleMove (self.pos2, TSPEED_LINEAR, self.speed, door_rotating_hit_top); @@ -436,20 +432,20 @@ void door_trigger_touch() {SELFPARAM(); if (other.health < 1) #ifdef SVQC - if (!((other.iscreature || (other.flags & FL_PROJECTILE)) && !PHYS_DEAD(other))) + if (!((other.iscreature || (other.flags & FL_PROJECTILE)) && !IS_DEAD(other))) #elif defined(CSQC) - if(!((IS_CLIENT(other) || other.classname == "csqcprojectile") && !PHYS_DEAD(other))) + if(!((IS_CLIENT(other) || other.classname == "csqcprojectile") && !IS_DEAD(other))) #endif return; - if (time < self.attack_finished_single) + if (time < self.door_finished) return; // check if door is locked - if (!door_check_keys()) + if (!door_check_keys(self, other)) return; - self.attack_finished_single = time + 1; + self.door_finished = time + 1; activator = other; @@ -457,13 +453,12 @@ void door_trigger_touch() door_use (); } -void spawn_field(vector fmins, vector fmaxs) +void door_spawnfield(vector fmins, vector fmaxs) {SELFPARAM(); entity trigger; vector t1 = fmins, t2 = fmaxs; - trigger = spawn(); - trigger.classname = "doortriggerfield"; + trigger = new(doortriggerfield); trigger.movetype = MOVETYPE_NONE; trigger.solid = SOLID_TRIGGER; trigger.owner = self; @@ -533,7 +528,7 @@ void LinkDoors() if (self.items) return; - spawn_field(self.absmin, self.absmax); + door_spawnfield(self.absmin, self.absmax); return; // don't want to link this door } @@ -601,9 +596,11 @@ void LinkDoors() if (self.items) return; - spawn_field(cmins, cmaxs); + door_spawnfield(cmins, cmaxs); } +REGISTER_NET_LINKED(ENT_CLIENT_DOOR) + #ifdef SVQC /*QUAKED spawnfunc_func_door (0 .5 .8) ? START_OPEN x DOOR_DONT_LINK GOLD_KEY SILVER_KEY TOGGLE if two doors touch, they are assumed to be connected and operate as a unit. @@ -636,7 +633,7 @@ FIXME: only one sound set available at the time being float door_send(entity to, float sf) {SELFPARAM(); - WriteByte(MSG_ENTITY, ENT_CLIENT_DOOR); + WriteHeader(MSG_ENTITY, ENT_CLIENT_DOOR); WriteByte(MSG_ENTITY, sf); if(sf & SF_TRIGGER_INIT) @@ -646,7 +643,7 @@ float door_send(entity to, float sf) WriteString(MSG_ENTITY, self.model); - trigger_common_write(true); + trigger_common_write(self, true); WriteCoord(MSG_ENTITY, self.pos1_x); WriteCoord(MSG_ENTITY, self.pos1_y); @@ -707,31 +704,31 @@ void door_init_startopen() #endif } -void door_reset() -{SELFPARAM(); - SUB_SETORIGIN(self, self.pos1); - self.SUB_VELOCITY = '0 0 0'; - self.state = STATE_BOTTOM; - self.SUB_THINK = func_null; - self.SUB_NEXTTHINK = 0; +void door_reset(entity this) +{ + SUB_SETORIGIN(this, this.pos1); + this.SUB_VELOCITY = '0 0 0'; + this.state = STATE_BOTTOM; + this.SUB_THINK = func_null; + this.SUB_NEXTTHINK = 0; #ifdef SVQC - self.SendFlags |= SF_TRIGGER_RESET; + this.SendFlags |= SF_TRIGGER_RESET; #endif } #ifdef SVQC // spawnflags require key (for now only func_door) -void spawnfunc_func_door() -{SELFPARAM(); +spawnfunc(func_door) +{ // Quake 1 keys compatibility if (self.spawnflags & SPAWNFLAGS_GOLD_KEY) self.itemkeys |= ITEM_KEY_BIT(0); if (self.spawnflags & SPAWNFLAGS_SILVER_KEY) self.itemkeys |= ITEM_KEY_BIT(1); - SetMovedir (); + SetMovedir(self); self.max_health = self.health; if (!InitMovingBrushTrigger()) @@ -739,6 +736,13 @@ void spawnfunc_func_door() self.effects |= EF_LOWPRECISION; self.classname = "door"; + if(self.noise == "") + self.noise = "misc/talk.wav"; + if(self.noise3 == "") + self.noise3 = "misc/talk.wav"; + precache_sound(self.noise); + precache_sound(self.noise3); + self.blocked = door_blocked; self.use = door_use; @@ -795,83 +799,90 @@ void spawnfunc_func_door() #elif defined(CSQC) -void door_draw() +void door_draw(entity this) { - Movetype_Physics_NoMatchServer(); + Movetype_Physics_NoMatchServer(this); - trigger_draw_generic(); + trigger_draw_generic(this); } -void ent_door() -{SELFPARAM(); +NET_HANDLE(ENT_CLIENT_DOOR, bool isnew) +{ float sf = ReadByte(); if(sf & SF_TRIGGER_INIT) { - self.classname = strzone(ReadString()); - self.spawnflags = ReadByte(); + this.classname = strzone(ReadString()); + this.spawnflags = ReadByte(); - self.mdl = strzone(ReadString()); - _setmodel(self, self.mdl); + this.mdl = strzone(ReadString()); + _setmodel(this, this.mdl); trigger_common_read(true); - self.pos1_x = ReadCoord(); - self.pos1_y = ReadCoord(); - self.pos1_z = ReadCoord(); - self.pos2_x = ReadCoord(); - self.pos2_y = ReadCoord(); - self.pos2_z = ReadCoord(); - - self.size_x = ReadCoord(); - self.size_y = ReadCoord(); - self.size_z = ReadCoord(); - - self.wait = ReadShort(); - self.speed = ReadShort(); - self.lip = ReadByte(); - self.state = ReadByte(); - self.SUB_LTIME = ReadCoord(); - - self.solid = SOLID_BSP; - self.movetype = MOVETYPE_PUSH; - self.trigger_touch = door_touch; - self.draw = door_draw; - self.drawmask = MASK_NORMAL; - self.use = door_use; + vector v; + + v.x = ReadCoord(); + v.y = ReadCoord(); + v.z = ReadCoord(); + this.pos1 = v; + + v.x = ReadCoord(); + v.y = ReadCoord(); + v.z = ReadCoord(); + this.pos2 = v; + + v.x = ReadCoord(); + v.y = ReadCoord(); + v.z = ReadCoord(); + this.size = v; + + this.wait = ReadShort(); + this.speed = ReadShort(); + this.lip = ReadByte(); + this.state = ReadByte(); + this.SUB_LTIME = ReadCoord(); + + this.solid = SOLID_BSP; + this.movetype = MOVETYPE_PUSH; + this.trigger_touch = door_touch; + this.draw = door_draw; + this.drawmask = MASK_NORMAL; + this.use = door_use; LinkDoors(); - if(self.spawnflags & DOOR_START_OPEN) + if(this.spawnflags & DOOR_START_OPEN) door_init_startopen(); - self.move_time = time; - self.move_origin = self.origin; - self.move_movetype = MOVETYPE_PUSH; - self.move_angles = self.angles; - self.move_blocked = door_blocked; + this.move_time = time; + this.move_origin = this.origin; + this.move_movetype = MOVETYPE_PUSH; + this.move_angles = this.angles; + this.move_blocked = door_blocked; } if(sf & SF_TRIGGER_RESET) { - door_reset(); + door_reset(this); } if(sf & SF_TRIGGER_UPDATE) { - self.origin_x = ReadCoord(); - self.origin_y = ReadCoord(); - self.origin_z = ReadCoord(); - setorigin(self, self.origin); - self.move_origin = self.origin; - - self.pos1_x = ReadCoord(); - self.pos1_y = ReadCoord(); - self.pos1_z = ReadCoord(); - self.pos2_x = ReadCoord(); - self.pos2_y = ReadCoord(); - self.pos2_z = ReadCoord(); + this.origin_x = ReadCoord(); + this.origin_y = ReadCoord(); + this.origin_z = ReadCoord(); + setorigin(this, this.origin); + this.move_origin = this.origin; + + this.pos1_x = ReadCoord(); + this.pos1_y = ReadCoord(); + this.pos1_z = ReadCoord(); + this.pos2_x = ReadCoord(); + this.pos2_y = ReadCoord(); + this.pos2_z = ReadCoord(); } + return true; } #endif