r4298 - in trunk/data: models/weapons qcsrc/server textures

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Sep 2 16:01:37 EDT 2008


Author: div0
Date: 2008-09-02 16:01:37 -0400 (Tue, 02 Sep 2008)
New Revision: 4298

Added:
   trunk/data/models/weapons/g_porto.md3
   trunk/data/models/weapons/v_porto.md3
   trunk/data/models/weapons/w_porto.zym
   trunk/data/qcsrc/server/w_porto.qc
   trunk/data/textures/portalgun.tga
   trunk/data/textures/portalgun_gloss.tga
   trunk/data/textures/portalgun_glow.tga
   trunk/data/textures/portalgun_norm.tga
Modified:
   trunk/data/qcsrc/server/portals.qc
Log:
fix Port-O-Launch


Added: trunk/data/models/weapons/g_porto.md3
===================================================================
(Binary files differ)


Property changes on: trunk/data/models/weapons/g_porto.md3
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/models/weapons/v_porto.md3
===================================================================
(Binary files differ)


Property changes on: trunk/data/models/weapons/v_porto.md3
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/models/weapons/w_porto.zym
===================================================================
(Binary files differ)


Property changes on: trunk/data/models/weapons/w_porto.zym
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc	2008-09-02 19:06:56 UTC (rev 4297)
+++ trunk/data/qcsrc/server/portals.qc	2008-09-02 20:01:37 UTC (rev 4298)
@@ -17,14 +17,20 @@
 vector fixedvectoangles2(vector v, vector w)
 {
 	vector a;
-	a = vectoangles(v, w);
+	a = vectoangles2(v, w);
 	a_x = -a_x;
 	return a;
 }
 
+void fixedmakevectors(vector a)
+{
+	//a_x = -a_x;
+	makevectors(a);
+}
+
 vector Portal_Transform_Apply(vector transform, vector v)
 {
-	makevectors(transform);
+	fixedmakevectors(transform);
 	return v_forward * v_x
 	     + v_right   * (-v_y)
 		 + v_up      * v_z;
@@ -33,7 +39,7 @@
 vector Portal_Transform_Multiply(vector t1, vector t2)
 {
 	vector m_forward, m_up;
-	makevectors(t2); m_forward = v_forward; m_up = v_up;
+	fixedmakevectors(t2); m_forward = v_forward; m_up = v_up;
 	m_forward = Portal_Transform_Apply(t1, m_forward);
 	m_up = Portal_Transform_Apply(t1, m_up);
 	return fixedvectoangles2(m_forward, m_up);
@@ -42,7 +48,7 @@
 vector Portal_Transform_Invert(vector transform)
 {
 	vector i_forward, i_up;
-	makevectors(transform);
+	fixedmakevectors(transform);
 	// we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
 	// but these are orthogonal unit vectors!
 	// so to invert, we can simply vectoangles the TRANSPOSED matrix
@@ -59,7 +65,7 @@
 	print("Transform: ", vtos(transform), "\n");
 	print("Inverted: ", vtos(v), "\n");
 	print("Verify: ", vtos(Portal_Transform_Multiply(v, transform)), "\n");
-	makevectors(Portal_Transform_Multiply(v, transform));
+	fixedmakevectors(Portal_Transform_Multiply(v, transform));
 	print("Verify: ", vtos(v_forward), "\n");
 	print("Verify: ", vtos(v_right), "\n");
 	print("Verify: ", vtos(v_up), "\n");
@@ -92,7 +98,7 @@
 	// this now is INSIDE the plane... can't use that
 
 	// shift it out
-	makevectors(teleporter.enemy.angles);
+	fixedmakevectors(teleporter.enemy.mangle);
 	safe = teleporter.enemy.portal_safe_origin; // a valid player origin
 	step = to + ((safe - to) * v_forward) * v_forward;
 	tracebox(safe, PL_MIN, PL_MAX, step, MOVE_WORLDONLY, player);
@@ -115,7 +121,7 @@
 	}
 	else
 	{
-		ang = Portal_Transform_Multiply(transform, player.angles);
+		ang = Portal_Transform_Multiply(transform, player.mangle);
 	}
 
 	print("previous velocity: ", vtos(player.velocity), "\n");
@@ -147,7 +153,7 @@
 		return;
 	if(time < self.portal_activatetime)
 		return;
-	makevectors(self.angles);
+	fixedmakevectors(self.mangle);
 	if((other.origin - self.origin) * v_forward < 0)
 		return;
 	if(other.mins_x < PL_MIN_x || other.mins_y < PL_MIN_y || other.mins_z < PL_MIN_z
@@ -197,7 +203,7 @@
 
 void Portal_Connect(entity teleporter, entity destination)
 {
-	teleporter.portal_transform = Portal_Transform_Divide(Portal_Transform_TurnDirection(destination.angles), teleporter.angles);
+	teleporter.portal_transform = Portal_Transform_Divide(Portal_Transform_TurnDirection(destination.mangle), teleporter.mangle);
 	teleporter.enemy = destination;
 	destination.enemy = teleporter;
 	Portal_MakeInPortal(teleporter);
@@ -235,18 +241,41 @@
 	self = oldself;
 }
 
+float CheckWireframeBox(vector v0, vector dvx, vector dvy, vector dvz)
+{
+	traceline(v0, v0 + dvx, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0, v0 + dvy, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0, v0 + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx, v0 + dvx + dvy, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx, v0 + dvx + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvy, v0 + dvy + dvx, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvy, v0 + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvz, v0 + dvz + dvx, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvz, v0 + dvz + dvy, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx + dvy, v0 + dvx + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvx + dvz, v0 + dvx + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	traceline(v0 + dvy + dvz, v0 + dvx + dvy + dvz, MOVE_NORMAL, world); if(trace_fraction < 1) return 0;
+	return 1;
+}
+
 entity Portal_Spawn(entity own, vector org, vector ang)
 {
+	fixedmakevectors(ang);
+	if(!CheckWireframeBox(org - 64 * v_right - 64 * v_up, 128 * v_right, 128 * v_up, 32 * v_forward))
+		return world;
+
 	entity portal;
 	portal = spawn();
 	portal.classname = "portal";
 	portal.owner = own;
 	portal.origin = org;
+	portal.mangle = ang;
+	ang_x = -ang_x;
 	portal.angles = ang;
 	portal.think = Portal_Vanish;
 	portal.nextthink = time + 60;
 	portal.portal_activatetime = time + 0.1;
-	setmodel(portal, "models/items/g_h100.md3");
+	setmodel(portal, "models/portal.md3");
 
 	if(!Portal_FindSafeOrigin(portal))
 	{
@@ -287,7 +316,7 @@
 	}
 		
 	print("Plane normal: ", vtos(trace_plane_normal), "\n");
-	print("Portal angles: ", vtos(fixedvectoangles(trace_plane_normal)), "\n");
+	print("Portal angles: ", vtos(vectoangles(trace_plane_normal)), "\n");
 	own.portal_in = Portal_Spawn(own, trace_endpos + trace_plane_normal, fixedvectoangles2(trace_plane_normal, dir));
 	if(!own.portal_in)
 		return 0;
@@ -322,8 +351,8 @@
 	}
 		
 	print("Plane normal: ", vtos(trace_plane_normal), "\n");
-	print("Portal angles: ", vtos(fixedvectoangles(trace_plane_normal)), "\n");
-	own.portal_out = Portal_Spawn(own, trace_endpos + trace_plane_normal, fixedvectoangles2(trace_plane_normal, dir));
+	print("Portal angles: ", vtos(vectoangles(trace_plane_normal)), "\n");
+	own.portal_out = Portal_Spawn(own, trace_endpos + trace_plane_normal, fixedvectoangles2(trace_plane_normal, -1 * dir));
 	if(!own.portal_out)
 		return 0;
 	own.portal_out.portal_id = portal_id_val;

Added: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc	                        (rev 0)
+++ trunk/data/qcsrc/server/w_porto.qc	2008-09-02 20:01:37 UTC (rev 4298)
@@ -0,0 +1,106 @@
+.float porto_grenade_id;
+
+void W_Porto_Explode (void)
+{
+	remove(self);
+}
+
+void W_Porto_Touch1 (void)
+{
+	print(vtos(trace_plane_normal), "\n");
+	if(self.porto_grenade_id == 0)
+	{
+		self.porto_grenade_id = time;
+		if(!Portal_SpawnInPortalAtTrace(self.owner, self.velocity, self.porto_grenade_id))
+			remove(self);
+	}
+	else
+	{
+		Portal_SpawnOutPortalAtTrace(self.owner, self.velocity, self.porto_grenade_id);
+		remove(self);
+	}
+}
+
+void W_Porto_Attack (void)
+{
+	local entity gren;
+
+	if (cvar("g_use_ammunition"))
+		self.ammo_rockets = self.ammo_rockets - cvar("g_balance_porto_primary_ammo");
+	W_SetupShot (self, '0 0 0', FALSE, 4, "weapons/grenade_fire.wav");
+
+	//pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+	gren = spawn ();
+	gren.owner = self;
+	gren.classname = "porto";
+	gren.bot_dodge = TRUE;
+	gren.bot_dodgerating = 200;
+	gren.movetype = MOVETYPE_BOUNCEMISSILE;
+	gren.solid = SOLID_BBOX;
+	gren.effects = EF_LOWPRECISION;
+	gren.modelflags = MF_GRENADE;
+	setmodel(gren, "models/grenademodel.md3"); // precision set above
+	setsize(gren, '0 0 0', '0 0 0');
+	setorigin(gren, w_shotorg);
+
+	gren.nextthink = time + cvar("g_balance_porto_primary_lifetime");
+	gren.think = W_Porto_Explode;
+	gren.touch = W_Porto_Touch1;
+	gren.velocity = w_shotdir * cvar("g_balance_porto_primary_speed");
+	W_SetupProjectileVelocity(gren);
+
+	gren.angles = vectoangles (gren.velocity);
+	gren.flags = FL_PROJECTILE;
+}
+
+void W_Porto_Attack2 (void)
+{
+	// nothing yet (maybe find the last one and detonate it?)
+}
+
+void spawnfunc_weapon_porto (void)
+{
+	weapon_defaultspawnfunc(WEP_PORTO, 5000);
+}
+
+float w_porto(float req)
+{
+	if (req == WR_AIM)
+	{
+		self.BUTTON_ATCK = FALSE;
+		self.BUTTON_ATCK2 = FALSE;
+		if(bot_aim(cvar("g_balance_porto_primary_speed"), 0, cvar("g_balance_grenadelauncher_primary_lifetime"), FALSE))
+			self.BUTTON_ATCK = TRUE;
+	}
+	else if (req == WR_THINK)
+	{
+		if (self.BUTTON_ATCK)
+		if (weapon_prepareattack(0, cvar("g_balance_porto_primary_refire")))
+		{
+			W_Porto_Attack();
+			weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_porto_primary_animtime"), w_ready);
+		}
+	}
+	else if (req == WR_PRECACHE)
+	{
+		precache_model ("models/grenademodel.md3");
+		precache_model ("models/weapons/g_porto.md3");
+		precache_model ("models/weapons/v_porto.md3");
+		precache_model ("models/weapons/w_porto.zym");
+		precache_sound ("weapons/grenade_fire.wav");
+	}
+	else if (req == WR_SETUP)
+		weapon_setup(WEP_PORTO);
+	else if (req == WR_CHECKAMMO1)
+		return self.ammo_cells >= cvar("g_balance_porto_primary_ammo");
+	else if (req == WR_CHECKAMMO2)
+		return FALSE;
+	else if (req == WR_SUICIDEMESSAGE)
+		w_deathtypestring = "did the impossible";
+	else if (req == WR_KILLMESSAGE)
+		w_deathtypestring = "felt # doing the impossible";
+	else if (req == WR_SPAWNFUNC)
+		spawnfunc_weapon_porto();
+	return TRUE;
+};

Added: trunk/data/textures/portalgun.tga
===================================================================
(Binary files differ)


Property changes on: trunk/data/textures/portalgun.tga
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/textures/portalgun_gloss.tga
===================================================================
(Binary files differ)


Property changes on: trunk/data/textures/portalgun_gloss.tga
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/textures/portalgun_glow.tga
===================================================================
(Binary files differ)


Property changes on: trunk/data/textures/portalgun_glow.tga
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/data/textures/portalgun_norm.tga
===================================================================
(Binary files differ)


Property changes on: trunk/data/textures/portalgun_norm.tga
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream




More information about the nexuiz-commits mailing list