home *** CD-ROM | disk | FTP | other *** search
- /*
- **
- ** _observe.qc (Observer Code, 1.0)
- **
- ** Copyright (C) 1996 Johannes Plass
- **
- ** This program is free software; you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation; either version 2 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program; if not, write to the Free Software
- ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- **
- ** Author: Johannes Plass (plass@dipmza.physik.uni-mainz.de)
- **
- */
-
-
- void(entity player) ObserverInfo =
- {
- if (!USE_MODULE_OBSERVER) return;
- sprint(player,"# Observer: Allows you to peep.\n");
- sprint(player," Type 'help-observer' for help.\n");
- };
-
- void(entity player) ObserverInit =
- {
- if (!USE_MODULE_OBSERVER) return;
- stuffcmd(player,"alias help-observer \"impulse 205\"\n");
- };
-
- void(entity player) ObserverHelp =
- {
- if (!USE_MODULE_OBSERVER) return;
-
- // 123456789#123456789#123456789#12345678
- sprint(player,"# Observer: Allows to watch the\n");
- sprint(player," ongoing madness.\n");
- sprint(player," As observer you can:\n");
- sprint(player," - fly around.\n");
- sprint(player," - move to another watch-spot by \n");
- sprint(player," pressing the jump-button. \n");
- sprint(player," - join the game as regular player\n");
- sprint(player," by pressing the fire-button. \n");
- sprint(player," Press the jump-button to become an\n");
- sprint(player," observer when you are dead.\n");
- };
-
- void(entity player) ObserverSetPlayerPos;
-
- void () ObserverThink =
- {
- //dprint("ObserverThink: executing\n");//#jp#(debug)
-
- if (!USE_MODULE_OBSERVER) return;
-
- if (self.movetype != MOVETYPE_FLY) {
- // will come here after changing level
- self.observer_status = self.observer_status | OBSERVER_BECOME_OBSERVER;
- }
-
- // local string tmp;
- // local float norm;
- // tmp = ftos(self.speed); dprint(tmp); dprint(" ");
- // tmp = vtos(v_forward); dprint(tmp); dprint(" ");
- // dprint("\n");
-
- // {
- local float invcos,nv,nvp,nvpmax,nvs,nsp,sp,svz;
- local vector f,vp,vs;
-
- svz = self.velocity_z;
- self.velocity_z = 0;
-
- // v_forward is normalized
- f_x = v_forward_x;
- f_y = v_forward_y;
- f_z = 0;
- invcos = vlen(f); if (invcos) invcos= 1/invcos; else invcos=0;
- f = f*invcos; // normalize f
-
- sp = f * self.velocity;
- vp = sp*f;
- nvp = vlen(vp); if (sp<0) nvp = nvp*(-1);
- vs = self.velocity - vp;
-
- vp = v_forward * (nvp * invcos);
- vp_z = vp_z + svz;
- nvp = vlen(vp);
- nvpmax = (320 - 100*(v_forward * '0 0 1'));
- if (nvp > nvpmax) { vp = vp * (nvpmax/nvp); }
-
- self.velocity = vp + vs;
-
- // }
-
-
- self.weaponmodel = "";
- self.weaponframe = 0;
-
- if (self.observer_status & OBSERVER_BECOME_OBSERVER) {
- self.observer_pos_num = 0;
- self.observer_status = self.observer_status - OBSERVER_BECOME_OBSERVER;
- self.observer_pos_num = 1 + random() * 4;
- ObserverBecomeObserver(self);
- ObserverSetPlayerPos(self);
- // bprint(self.netname);
- // bprint(" became an observer.\n");
- }
-
- if (self.observer_status & OBSERVER_NEXTVIEW) {
- self.observer_pos_num = self.observer_pos_num + 1;
- ObserverSetPlayerPos(self);
- self.observer_status = self.observer_status - OBSERVER_NEXTVIEW;
- return;
- }
-
- if (self.observer_status & OBSERVER_PREVVIEW) {
- self.observer_pos_num = self.observer_pos_num - 1;
- ObserverSetPlayerPos(self);
- self.observer_status = self.observer_status - OBSERVER_PREVVIEW;
- return;
- }
-
- if (self.button0) {
- self.observer_status = self.observer_status | OBSERVER_BUTTON0;
- }
- if (self.button1) {
- self.observer_status = self.observer_status | OBSERVER_BUTTON1;
- }
- if (self.button2) {
- self.observer_status = self.observer_status | OBSERVER_BUTTON2;
- }
- if (self.button0 || self.button1 || self.button2) {
- return;
- }
-
- if (self.observer_status & (OBSERVER_BUTTON2 | OBSERVER_BUTTON1)) {
- if (!self.button0 && !self.button1 && !self.button2) {
- self.observer_status = OBSERVER_NEXTVIEW;
- return;
- }
- }
-
- if (self.observer_status & OBSERVER_BUTTON0) {
- if (!self.button0 && !self.button1 && !self.button2) {
- self.observer_status = OBSERVER_RESPAWN;
- return;
- }
- }
-
- if (self.observer_status & OBSERVER_RESPAWN) {
- if (! self.button0 && ! self.button1 && ! self.button2) {
- respawn();
- // remove flag must be set after respawn()
- PlayerFlagRemoveFlag(self,PLAYER_IS_OBSERVER);
- return;
- }
- }
- };
-
- float() ObserverDeathThink =
- {
-
- if (!USE_MODULE_OBSERVER) {
- return(0);
- }
-
- if (self.button1) {
- self.observer_status = self.observer_status | OBSERVER_BUTTON1;
- return(1);
- }
- if (self.button2) {
- self.observer_status = self.observer_status | OBSERVER_BUTTON2;
- return(1);
- }
-
- if (self.observer_status & (OBSERVER_BUTTON1 | OBSERVER_BUTTON2)) {
- if (!self.button0 && !self.button1 && !self.button2) {
- // this flag must be set before respawn()
- self.observer_status = OBSERVER_BECOME_OBSERVER;
- respawn();
- // player flag must be set after respawn()
- PlayerFlagSetFlag(self,PLAYER_IS_OBSERVER);
- return(1);
- }
- }
- return(0);
- };
-
- void(entity player) ObserverBecomeObserver =
- {
- //dprint("ObserverBecomeObserver: executing\n");//#jp#(debug)
-
- player.armorvalue = 0;
- player.items = 0;
- player.health = 999;
- player.ammo_shells = 0;
- player.ammo_nails = 0;
- player.ammo_rockets = 0;
- player.ammo_cells = 0;
- player.weapon = 0;
- player.currentammo = 1;
- player.takedamage = DAMAGE_NO;
- player.solid = SOLID_NOT;
- player.movetype = MOVETYPE_FLY;
- player.deadflag = DEAD_NO;
-
- setmodel (player, string_null);
- };
-
-
- entity(entity player) ObserverFindPos =
- {
- local entity spot;
- local float pos_num_startsearch;
-
- //dprint("ObserverFindPos: executing\n");
- if (player.observer_pos_num <= 0) player.observer_pos_num = 1;
- else if (player.observer_pos_num >= 21) player.observer_pos_num = 1;
- pos_num_startsearch = player.observer_pos_num;
-
- if (player.observer_pos_num <= 5) {
- spot = find (world, classname, "info_intermission");
- if (player.observer_pos_num >= 2 && !(!spot)) spot = find (spot, classname, "info_intermission");
- if (player.observer_pos_num >= 3 && !(!spot)) spot = find (spot, classname, "info_intermission");
- if (player.observer_pos_num >= 4 && !(!spot)) spot = find (spot, classname, "info_intermission");
- if (!spot) player.observer_pos_num = 5;
- }
- if (player.observer_pos_num >= 5) {
- spot = find (world, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 6 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 7 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 8 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 9 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 10 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 11 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 12 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 13 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 14 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 15 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 16 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 17 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 18 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 19 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (player.observer_pos_num >= 20 && !(!spot)) spot = find (spot, classname, "info_player_deathmatch");
- if (!spot) player.observer_pos_num = 21;
- }
- if (player.observer_pos_num >= 21) {
- spot = find (world, classname, "info_player_start");
- player.observer_pos_num = 21;
- }
- if (!spot && pos_num_startsearch != 1) {
- player.observer_pos_num = player.observer_pos_num + 1;
- spot=ObserverFindPos(player);
- }
- if (!spot) error ("ObserverFindPos: could not find start pos");
- return spot;
- };
-
- void(entity player) ObserverSetPlayerPos =
- {
- local entity pos;
- local vector posoffset;
-
- //dprint("ObserverSetPlayerPos: executing\n");//#jp#(debug)
-
- pos = ObserverFindPos(player);
-
- player.angles = player.v_angle = pos.mangle;
- player.fixangle = TRUE; // turn this way immediately
- player.view_ofs = '0 0 12'; // must be != '0 0 0'
- player.velocity = '0 0 0';
-
- makevectors (self.angles);
- setsize (player, '-12 -12 -12', '12 12 12');
-
-
- // avoid stuck observers for intermission spots
- if (player.observer_pos_num <=4) setorigin (player, pos.origin + '0 0 -60');
- else setorigin (player, pos.origin);
-
- //#jp# Hack to provide a decent flying velocity.
- //#jp# I'd normally expect the above three lines to be sufficient, but ...
- //#jp# Damn it, what a mess this is.
- //#jp# Hope this doesn't cause side effects.
-
- player.flags = player.flags | FL_ONGROUND;
- };
-
- /*
- =============
- Unused:
- player.view_ofs = '0 0 22'; // must be != '0 0 0'
- setsize (player, VEC_HULL_MIN, VEC_HULL_MAX);
- =============
- */
-
-
-
-
-
-
-
-
-
-
-
-
-