X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fitem_key.qc;h=5fa7834d1ce23e2751a7f689dd5e5e5c00726bd7;hb=6f37a8f8076a572097afb13de2c367a72717c927;hp=1b423f5020f5646312a3c0b8d7a14380bb073344;hpb=94579b4c440f739c1203ea5e546d3fcadb884c51;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/item_key.qc b/qcsrc/server/item_key.qc index 1b423f502..5fa7834d1 100644 --- a/qcsrc/server/item_key.qc +++ b/qcsrc/server/item_key.qc @@ -1,3 +1,11 @@ +#include "item_key.qh" +#include "_.qh" + +#include "../common/monsters/monsters.qh" +#include "../common/notifications.qh" +#include "../common/util.qh" +#include "../warpzonelib/util_server.qh" + /* TODO: - add an unlock sound (here to trigger_keylock and to func_door) @@ -7,48 +15,45 @@ TODO: - should keys have a trigger? */ -float item_keys_usekey(entity l, entity p) { +bool item_keys_usekey(entity l, entity p) { float valid = l.itemkeys & p.itemkeys; - - if not(valid) { + + if (!valid) { // other has none of the needed keys - return FALSE; + return false; } else if (l.itemkeys == valid) { // ALL needed keys were given l.itemkeys = 0; - return TRUE; + return true; } else { // only some of the needed keys were given - l.itemkeys &~= valid; - return TRUE; + l.itemkeys &= ~valid; + return true; } } string item_keys_keylist(float keylist) { - float base, l; - string n; - // no keys - if not(keylist) + if (!keylist) return ""; - + // one key if ((keylist & (keylist-1)) != 0) return strcat("the ", item_keys_names[lowestbit(keylist)]); - - n = ""; - base = 0; + + string n = ""; + int base = 0; while (keylist) { - l = lowestbit(keylist); + int l = lowestbit(keylist); if (n) n = strcat(n, ", the ", item_keys_names[base + l]); else n = strcat("the ", item_keys_names[base + l]); - + keylist = bitshift(keylist, -(l + 1)); base+= l + 1; } - + return n; } @@ -63,16 +68,16 @@ item_key * Key touch handler. */ void item_key_touch(void) { - if (other.classname != "player") + if (!IS_PLAYER(other)) return; - + // player already picked up this key if (other.itemkeys & self.itemkeys) return; - + other.itemkeys |= self.itemkeys; play2(other, self.noise); - + centerprint(other, self.message); }; @@ -81,17 +86,17 @@ void item_key_touch(void) { */ void spawn_item_key() { precache_model(self.model); - + if (self.spawnflags & 1) // FLOATING self.noalign = 1; - + if (self.noalign) self.movetype = MOVETYPE_NONE; else self.movetype = MOVETYPE_TOSS; - + precache_sound(self.noise); - + self.mdl = self.model; self.effects = EF_LOWPRECISION; setmodel(self, self.model); @@ -100,12 +105,12 @@ void spawn_item_key() { setsize(self, '-16 -16 -56', '16 16 0'); self.modelflags |= MF_ROTATE; self.solid = SOLID_TRIGGER; - + if (!self.noalign) { // first nudge it off the floor a little bit to avoid math errors setorigin(self, self.origin + '0 0 1'); - // note droptofloor returns FALSE if stuck/or would fall too far + // note droptofloor returns false if stuck/or would fall too far droptofloor(); } @@ -116,7 +121,7 @@ void spawn_item_key() { /*QUAKED item_key (0 .5 .8) (-16 -16 -24) (16 16 32) FLOATING A key entity. The itemkeys should contain one of the following key IDs: -1 - GOLD key - +1 - GOLD key - 2 - SILVER key 4 - BRONZE key 8 - RED keycard @@ -140,9 +145,9 @@ This is the only correct way to put keys on the map! itemkeys MUST always have exactly one bit set. */ void spawnfunc_item_key() { - local string _model, _netname; - local vector _colormod; - + string _netname; + vector _colormod; + // reject this entity if more than one key was set! if (self.itemkeys>0 && (self.itemkeys & (self.itemkeys-1)) != 0) { objerror("item_key.itemkeys must contain only 1 bit set specifying the key it represents!"); @@ -156,32 +161,32 @@ void spawnfunc_item_key() { _netname = "GOLD key"; _colormod = '1 .9 0'; break; - + case 2: _netname = "SILVER key"; _colormod = '.9 .9 .9'; break; - + case 4: _netname = "BRONZE key"; _colormod = '.6 .25 0'; break; - + case 8: _netname = "RED keycard"; _colormod = '.9 0 0'; break; - + case 16: _netname = "BLUE keycard"; _colormod = '0 0 .9'; break; - + case 32: _netname = "GREEN keycard"; _colormod = '0 .9 0'; break; - + default: _netname = "FLUFFY PINK keycard"; _colormod = '1 1 1'; @@ -192,13 +197,11 @@ void spawnfunc_item_key() { return; } break; - + } - + // find default model -#ifdef GMQCC - _model = string_null; -#endif + string _model = string_null; if (self.itemkeys <= ITEM_KEY_BIT(2)) { _model = "models/keys/key.md3"; } else if (self.itemkeys >= ITEM_KEY_BIT(3) && self.itemkeys <= ITEM_KEY_BIT(5)) { @@ -208,30 +211,30 @@ void spawnfunc_item_key() { remove(self); return; } - + // set defailt netname if (self.netname == "") self.netname = _netname; - + // set default colormod if (!self.colormod) self.colormod = _colormod; - + // set default model if (self.model == "") self.model = _model; - + // set default pickup message if (self.message == "") self.message = strzone(strcat("You've picked up the ", self.netname, "!")); if (self.noise == "") self.noise = "misc/itempickup.wav"; - + // save the name for later item_keys_names[lowestbit(self.itemkeys)] = self.netname; - // put the key on the map + // put the key on the map spawn_item_key(); } @@ -282,13 +285,11 @@ trigger_keylock * trigger givent targets */ void trigger_keylock_trigger(string s) { - local entity t, stemp, otemp, atemp; - - stemp = self; - otemp = other; - atemp = activator; - - + entity stemp = self; + entity otemp = other; + entity atemp = activator; + + entity t; for(t = world; (t = find(t, targetname, s)); ) if (t.use) { self = t; @@ -296,7 +297,7 @@ void trigger_keylock_trigger(string s) { activator = atemp; self.use(); } - + self = stemp; other = otemp; activator = atemp; @@ -306,63 +307,61 @@ void trigger_keylock_trigger(string s) { * kill killtarget of trigger keylock. */ void trigger_keylock_kill(string s) { - local entity t; + entity t; for(t = world; (t = find(t, targetname, s)); ) remove(t); }; void trigger_keylock_touch(void) { - local float key_used, started_delay; - - key_used = FALSE; - started_delay = FALSE; - + bool key_used = false; + bool started_delay = false; + // only player may trigger the lock - if (other.classname != "player") + if (!IS_PLAYER(other)) return; - - + + // check silver key if (self.itemkeys) key_used = item_keys_usekey(self, other); - + activator = other; - + if (self.itemkeys) { // at least one of the keys is missing if (key_used) { // one or more keys were given, but others are still missing! play2(other, self.noise1); - centerprint(other, strcat("You also need ", item_keys_keylist(self.itemkeys), "!")); + Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(self.itemkeys)); other.key_door_messagetime = time + 2; } else if (other.key_door_messagetime <= time) { // no keys were given play2(other, self.noise2); - centerprint(other, strcat("You need ", item_keys_keylist(self.itemkeys), "!")); + Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(self.itemkeys)); other.key_door_messagetime = time + 2; } - + // trigger target2 - if (self.delay <= time || started_delay == TRUE) + if (self.delay <= time || started_delay == true) if (self.target2) { trigger_keylock_trigger(self.target2); - started_delay = TRUE; + started_delay = true; self.delay = time + self.wait; } } else { // all keys were given! play2(other, self.noise); centerprint(other, self.message); - + if (self.target) trigger_keylock_trigger(self.target); - + if (self.killtarget) trigger_keylock_kill(self.killtarget); - + remove(self); } - + }; /*QUAKED trigger_keylock (.0 .5 .8) ? @@ -390,10 +389,10 @@ void spawnfunc_trigger_keylock(void) { return; } - // set unlocked message + // set unlocked message if (self.message == "") self.message = "Unlocked!"; - + // set default unlock noise if (self.noise == "") { if (self.sounds == 1) @@ -403,26 +402,26 @@ void spawnfunc_trigger_keylock(void) { else //if (self.sounds == 3) { self.noise = "misc/trigger1.wav"; } - + // set default use key sound if (self.noise1 == "") self.noise1 = "misc/decreasevalue.wav"; - + // set closed sourd if (self.noise2 == "") self.noise2 = "misc/talk.wav"; - + // delay between triggering message2 and trigger2 if (!self.wait) self.wait = 5; - + // precache sounds precache_sound(self.noise); precache_sound(self.noise1); precache_sound(self.noise2); - + EXACTTRIGGER_INIT; - + self.touch = trigger_keylock_touch; };