X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fitem_key.qc;h=1518151f2c85b457fff515b37634030b68f838b0;hb=86c9dc7c3696c329496b06375c1e79fb407401ce;hp=f4893094efb533c429902e0defbd2ad2ad82b1df;hpb=cfc1a19f21842b65814c855082b059b22ff0c392;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/item_key.qc b/qcsrc/server/item_key.qc index f4893094e..1518151f2 100644 --- a/qcsrc/server/item_key.qc +++ b/qcsrc/server/item_key.qc @@ -1,15 +1,11 @@ -#if defined(CSQC) -#elif defined(MENUQC) -#elif defined(SVQC) - #include "../dpdefs/progsdefs.qh" - #include "../dpdefs/dpextensions.qh" - #include "../warpzonelib/util_server.qh" - #include "../common/util.qh" - #include "../common/monsters/monsters.qh" - #include "defs.qh" - #include "../common/notifications.qh" - #include "item_key.qh" -#endif +#include "item_key.qh" +#include "_all.qh" + +#include "../common/triggers/subs.qh" +#include "../common/monsters/all.qh" +#include "../common/notifications.qh" +#include "../common/util.qh" +#include "../warpzonelib/util_server.qh" /* TODO: @@ -20,7 +16,8 @@ TODO: - should keys have a trigger? */ -bool item_keys_usekey(entity l, entity p) { +bool item_keys_usekey(entity l, entity p) +{ float valid = l.itemkeys & p.itemkeys; if (!valid) { @@ -38,9 +35,6 @@ bool item_keys_usekey(entity l, entity p) { } string item_keys_keylist(float keylist) { - float base, l; - string n; - // no keys if (!keylist) return ""; @@ -49,10 +43,10 @@ string item_keys_keylist(float keylist) { 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 @@ -281,156 +275,3 @@ void spawnfunc_item_key2(void) { self.itemkeys = ITEM_KEY_BIT(0); spawnfunc_item_key(); }; - - -/* -================================ -trigger_keylock -================================ -*/ - -/** - * trigger givent targets - */ -void trigger_keylock_trigger(string s) { - entity stemp = self; - entity otemp = other; - entity atemp = activator; - - entity t; - for(t = world; (t = find(t, targetname, s)); ) - if (t.use) { - self = t; - other = stemp; - activator = atemp; - self.use(); - } - - self = stemp; - other = otemp; - activator = atemp; -}; - -/** - * kill killtarget of trigger keylock. - */ -void trigger_keylock_kill(string s) { - entity t; - for(t = world; (t = find(t, targetname, s)); ) - remove(t); -}; - -void trigger_keylock_touch(void) { - bool key_used = false; - bool started_delay = false; - - // only player may trigger the lock - 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); - 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); - 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.target2) { - trigger_keylock_trigger(self.target2); - 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) ? -Keylock trigger. Must target other entities. -This trigger will trigger target entities when all required keys are provided. --------- KEYS -------- -itemkeys: A bit field with key IDs that are needed to open this lock. -sounds: 1 to play misc/secret.wav, 2 to play misc/talk.wav, 3 to play misc/trigger1.wav (3 is default) -target: trigger all entities with this targetname when triggered and all keys have been given to it, then remove this trigger -target2: trigger all entities with this targetname when triggered without giving it all the required keys. -killtarget: remove all entities with this targetname when triggered with all the needed keys. -message: print this message to the player who activated the trigger when all needed keys have been given. -message2: print this message to the player who activated the trigger when not all of the needed keys have been given. -noise: sound to play when lock gets unlocked (default: see sounds) -noise1: sound to play when only some of the needed key were used but not all (default: misc/decreasevalue.wav) -noise2: sound to play when a key is missing (default: misc/talk.wav) -wait: prevent triggering again for this amount of time (default: 5) - applies to target2, target3, target4. ----------NOTES---------- -If spawned without any key specified in itemkeys, this trigger will display an error and remove itself. -message2 and noise2 will be resent to the player every 2 seconds while he is in the trigger zone. -*/ -void spawnfunc_trigger_keylock(void) { - if (!self.itemkeys) { - remove(self); - return; - } - - // set unlocked message - if (self.message == "") - self.message = "Unlocked!"; - - // set default unlock noise - if (self.noise == "") { - if (self.sounds == 1) - self.noise = "misc/secret.wav"; - else if (self.sounds == 2) - self.noise = "misc/talk.wav"; - 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; -}; - -