#include "onslaught.qh"
+#ifndef MENUQC
+REGISTER_NET_LINKED(ENT_ONSCAMERA)
+#endif
+
#ifdef CSQC
+entity generator_camera;
+NET_HANDLE(ENT_ONSCAMERA, bool isnew)
+{
+ this.origin_x = ReadCoord();
+ this.origin_y = ReadCoord();
+ this.origin_z = ReadCoord();
+ setorigin(this, this.origin);
+
+ this.angles_x = ReadAngle();
+ this.angles_y = ReadAngle();
+ this.angles_z = ReadAngle();
+
+ this.drawmask = MASK_NORMAL;
+ setmodel(this, MDL_Null); // give it a size for clientcamera
+ setsize(this, '-1 -1 -1', '1 1 1');
+
+ generator_camera = this;
+ return true;
+}
+
REGISTER_MUTATOR(cl_ons, true);
float ons_roundlost;
{
if(ons_roundlost)
{
- M_ARGV(0, vector) = generator_origin;
+ M_ARGV(0, vector) = generator_camera.origin;
M_ARGV(1, vector) = autocvar_cl_eventchase_generator_viewoffset;
M_ARGV(0, float) = autocvar_cl_eventchase_generator_distance;
return true;
float autocvar_g_onslaught_click_radius;
void FixSize(entity e);
+entity cam;
// =======================
// CaptureShield Functions
// =======================
+bool clientcamera_send(entity this, entity to, int sf)
+{
+ WriteHeader(MSG_ENTITY, ENT_ONSCAMERA);
+
+ WriteCoord(MSG_ENTITY, this.origin_x);
+ WriteCoord(MSG_ENTITY, this.origin_y);
+ WriteCoord(MSG_ENTITY, this.origin_z);
+
+ WriteAngle(MSG_ENTITY, this.angles_x);
+ WriteAngle(MSG_ENTITY, this.angles_y);
+ WriteAngle(MSG_ENTITY, this.angles_z);
+
+ return true;
+}
+
bool ons_CaptureShield_Customize(entity this, entity client)
{
entity e = WaypointSprite_getviewentity(client);
}
}
+void ons_camSetup(entity this)
+{
+ if(cam) return;
+
+ vector dir;
+ vector ang = '0 0 0';
+ vector best_ang = '0 0 0';
+ float best_trace_fraction = 0;
+ while(ang.y < 360)
+ {
+ dir = eX * cos(ang.y * DEG2RAD) + eY * sin(ang.y * DEG2RAD);
+ dir *= 500;
+ traceline(this.origin, this.origin - dir, MOVE_WORLDONLY, this);
+ if(trace_fraction > best_trace_fraction)
+ {
+ best_trace_fraction = trace_fraction;
+ best_ang = ang;
+ if(trace_fraction == 1)
+ break;
+ }
+ ang.y += 90;
+ if(ang.y == 360)
+ ang.y = 45;
+ }
+
+ cam = new(objective_camera);
+ cam.origin = this.origin;
+ setorigin(cam, cam.origin);
+ cam.angles = best_ang;
+ Net_LinkEntity(cam, false, 0, clientcamera_send);
+
+ FOREACH_CLIENT(true, it.clientcamera = cam;);
+
+ WriteByte(MSG_ALL, SVC_SETVIEWANGLES);
+ WriteAngle(MSG_ALL, cam.angles_x);
+ WriteAngle(MSG_ALL, cam.angles_y);
+ WriteAngle(MSG_ALL, cam.angles_z);
+}
+
void ons_GeneratorDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
{
if(damage <= 0) { return; }
//WaypointSprite_Kill(this.sprite); // can't do this yet, code too poor
onslaught_updatelinks();
+
+ ons_camSetup(this);
}
// Throw some flaming gibs on damage, more damage = more chance for gib