📄 cl_tent.pas
字号:
end;
Inc(b);
end;
Com_Printf('beam list overflow!'#10);
Result := ent;
end;
// ROGUE
{
=========
CL_ParsePlayerBeam
- adds to the cl_playerbeam array instead of the cl_beams array
=========
}
function CL_ParsePlayerBeam(Model: Model_p): Integer;
var
Ent: Integer;
Start, End_, Offset: Vec3_t;
b: Beam_p;
I: Integer;
begin
ent := MSG_ReadShort(net_message);
MSG_ReadPos(net_message, start);
MSG_ReadPos(net_message, end_);
// PMM - network optimization
if (model = cl_mod_heatbeam) then
VectorSet(offset, 2, 7, -3)
else if (model = cl_mod_monster_heatbeam) then
begin
model := cl_mod_heatbeam;
VectorSet(offset, 0, 0, 0);
end
else
MSG_ReadPos(net_message, offset);
// Com_Printf ('end- %f %f %f'#10, end[0], end[1], end[2]);
// override any beam with the same entity
// PMM - For player beams, we only want one per player (entity) so..
b := @cl_playerbeams;
for i := 0 to MAX_BEAMS - 1 do
begin
if (b^.entity = ent) then
begin
b^.entity := ent;
b^.model := model;
b^.endtime := cl.time + 200;
VectorCopy(start, b^.start);
VectorCopy(end_, b^.end_);
VectorCopy(offset, b^.offset);
Result := ent;
exit;
end;
Inc(b);
end;
// find a free beam
b := @cl_playerbeams;
for i := 0 to MAX_BEAMS - 1 do
begin
if (b^.model = nil) or (b^.endtime < cl.time) then
begin
b^.entity := ent;
b^.model := model;
b^.endtime := cl.time + 100; // PMM - this needs to be 100 to prevent multiple heatbeams
VectorCopy(start, b^.start);
VectorCopy(end_, b^.end_);
VectorCopy(offset, b^.offset);
Result := ent;
exit;
end;
Inc(b);
end;
Com_Printf('beam list overflow!'#10);
result := ent;
end;
//rogue
{
=========
CL_ParseLightning
=========
}
function CL_ParseLightning(Model: Model_p): Integer;
var
srcEnt, destEnt, i: Integer;
Start, End_: vec3_t;
b: Beam_p;
begin
srcEnt := MSG_ReadShort(net_message);
destEnt := MSG_ReadShort(net_message);
MSG_ReadPos(net_message, start);
MSG_ReadPos(net_message, end_);
// override any beam with the same source AND destination entities
b := @cl_beams;
for i := 0 to MAX_BEAMS - 1 do
begin
if (b^.entity = srcEnt) and (b^.dest_entity = destEnt) then
begin
// Com_Printf('%d: OVERRIDE %d ^. %d'#10, cl.time, srcEnt, destEnt);
b^.entity := srcEnt;
b^.dest_entity := destEnt;
b^.model := model;
b^.endtime := cl.time + 200;
VectorCopy(start, b^.start);
VectorCopy(end_, b^.end_);
VectorClear(b^.offset);
result := srcEnt;
exit;
end;
Inc(b);
end;
// find a free beam
b := @cl_beams;
for i := 0 to MAX_BEAMS - 1 do
begin
if (b^.model = nil) or (b^.endtime < cl.time) then
begin
// Com_Printf('%d: NORMAL %d ^. %d'#10, cl.time, srcEnt, destEnt);
b^.entity := srcEnt;
b^.dest_entity := destEnt;
b^.model := model;
b^.endtime := cl.time + 200;
VectorCopy(start, b^.start);
VectorCopy(end_, b^.end_);
VectorClear(b^.offset);
result := srcEnt;
exit;
end;
Inc(b);
end;
Com_Printf('beam list overflow!'#10);
result := srcEnt;
end;
{
=========
CL_ParseLaser
=========
}
procedure CL_ParseLaser(Colors: Integer);
var
Start, End_: vec3_t;
l: laser_p;
i: Integer;
begin
MSG_ReadPos(net_message, start);
MSG_ReadPos(net_message, end_);
l := @cl_lasers;
for i := 0 to MAX_LASERS - 1 do
begin
if (l.endtime < cl.time) then
begin
l.ent.flags := RF_TRANSLUCENT or RF_BEAM;
VectorCopy(start, vec3_t(l.ent.origin));
VectorCopy(end_, vec3_t(l.ent.oldorigin));
l.ent.alpha := 0.30;
l.ent.skinnum := (colors shr ((rand() mod 4) * 8)) and $FF; // was (rand() % 4)
l.ent.model := nil;
l.ent.frame := 4;
l.endtime := cl.time + 100;
exit;
end;
Inc(l);
end;
end;
//=======
//ROGUE
procedure CL_ParseSteam;
var
pos, dir: vec3_t;
id, i, r, cnt, color, magnitude: Integer;
s, free_sustain: cl_sustain_p;
begin
id := MSG_ReadShort(net_message); // an id of -1 is an instant effect
if (id <> -1) then
begin // sustains
// Com_Printf ('Sustain effect id %d\n', id);
free_sustain := nil;
for i := 0 to MAX_SUSTAINS - 1 do
begin
s := @cl_sustains[i];
if (s.id = 0) then
begin
free_sustain := s;
break;
end;
end;
if (free_sustain <> nil) then
begin
s.id := id;
s.count := MSG_ReadByte(net_message);
MSG_ReadPos(net_message, s.org);
MSG_ReadDir(net_message, s.dir);
r := MSG_ReadByte(net_message);
s.color := r and $FF;
s.magnitude := MSG_ReadShort(net_message);
s.endtime := cl.time + MSG_ReadLong(net_message);
s.think := CL_ParticleSteamEffect2;
s.thinkinterval := 100;
s.nextthink := cl.time;
end
else
begin
// Com_Printf ('No free sustains!\n');
// FIXME - read the stuff anyway
cnt := MSG_ReadByte(net_message);
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
r := MSG_ReadByte(net_message);
magnitude := MSG_ReadShort(net_message);
magnitude := MSG_ReadLong(net_message); // really interval
end;
end
else
begin // instant
cnt := MSG_ReadByte(net_message);
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
r := MSG_ReadByte(net_message);
magnitude := MSG_ReadShort(net_message);
color := r and $FF;
CL_ParticleSteamEffect(pos, dir, color, cnt, magnitude);
// S_StartSound (pos, 0, 0, cl_sfx_lashit, 1, ATTN_NORM, 0);
end;
end;
procedure CL_ParseWidow;
var
Pos: vec3_t;
id, i: Integer;
s, free_sustain: cl_sustain_p;
begin
id := MSG_ReadShort(net_message);
free_sustain := nil;
for i := 0 to MAX_SUSTAINS - 1 do
begin
s := @cl_sustains[i];
if (s.id = 0) then
begin
free_sustain := s;
break;
end;
end;
if (free_sustain <> nil) then
begin
s.id := id;
MSG_ReadPos(net_message, s.org);
s.endtime := cl.time + 2100;
s.think := CL_Widowbeamout;
s.thinkinterval := 1;
s.nextthink := cl.time;
end
else
begin // no free sustains
// FIXME - read the stuff anyway
MSG_ReadPos(net_message, pos);
end;
end;
procedure CL_ParseNuke;
var
Pos: Vec3_t;
id, i: Integer;
s, free_sustain: cl_sustain_p;
begin
free_sustain := nil;
for i := 0 to MAX_SUSTAINS - 1 do
begin
s := @cl_sustains[i];
if (s.id = 0) then
begin
free_sustain := s;
break;
end;
end;
if (free_sustain <> nil) then
begin
s.id := 21000;
MSG_ReadPos(net_message, s.org);
s.endtime := cl.time + 1000;
s.think := CL_Nukeblast;
s.thinkinterval := 1;
s.nextthink := cl.time;
end
else
begin // no free sustains
// FIXME - read the stuff anyway
MSG_ReadPos(net_message, pos);
end;
end;
//ROGUE
//=======
{
=========
CL_ParseTEnt
=========
}
const
splash_color: array[0..6] of byte =
($00, $E0, $B0, $50, $D0, $E0, $E8);
procedure CL_ParseTEnt;
var
type_: Integer;
Pos, Pos2, Dir: vec3_t;
Ex: Explosion_p;
Cnt, Color, r, Ent, Magnitude: Integer;
begin
type_ := MSG_ReadByte(net_message);
case temp_event_t(type_) of
TE_BLOOD:
begin // bullet hitting flesh
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
CL_ParticleEffect(pos, dir, $E8, 60);
end;
TE_GUNSHOT, // bullet hitting wall
TE_SPARKS,
TE_BULLET_SPARKS:
begin
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
if temp_event_t(type_) = TE_GUNSHOT then
CL_ParticleEffect(pos, dir, 0, 40)
else
CL_ParticleEffect(pos, dir, $E0, 6);
if (temp_event_t(type_) <> TE_SPARKS) then
begin
CL_SmokeAndFlash(pos);
// impact sound
cnt := rand() and 15;
case cnt of
1: S_StartSound(@pos, 0, 0, cl_sfx_ric1, 1, ATTN_NORM, 0);
2: S_StartSound(@pos, 0, 0, cl_sfx_ric2, 1, ATTN_NORM, 0);
3: S_StartSound(@pos, 0, 0, cl_sfx_ric3, 1, ATTN_NORM, 0);
end;
end;
end;
TE_SCREEN_SPARKS,
TE_SHIELD_SPARKS:
begin
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
if temp_event_t(type_) = TE_SCREEN_SPARKS then
CL_ParticleEffect(pos, dir, $D0, 40)
else
CL_ParticleEffect(pos, dir, $B0, 40);
//FIXME : replace or remove this sound
S_StartSound(@pos, 0, 0, cl_sfx_lashit, 1, ATTN_NORM, 0);
end;
TE_SHOTGUN:
begin // bullet hitting wall
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
CL_ParticleEffect(pos, dir, 0, 20);
CL_SmokeAndFlash(pos);
end;
TE_SPLASH:
begin // bullet hitting water
cnt := MSG_ReadByte(net_message);
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
r := MSG_ReadByte(net_message);
if (r > 6) then
color := $00
else
color := splash_color[r];
CL_ParticleEffect(pos, dir, color, cnt);
if (r = SPLASH_SPARKS) then
begin
r := rand() and 3;
case r of
0: S_StartSound(@pos, 0, 0, cl_sfx_spark5, 1, ATTN_STATIC, 0);
1: S_StartSound(@pos, 0, 0, cl_sfx_spark6, 1, ATTN_STATIC, 0);
else
S_StartSound(@pos, 0, 0, cl_sfx_spark7, 1, ATTN_STATIC, 0);
end;
end;
end;
TE_LASER_SPARKS:
begin
cnt := MSG_ReadByte(net_message);
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
color := MSG_ReadByte(net_message);
CL_ParticleEffect2(pos, dir, color, cnt);
end;
// RAFAEL
TE_BLUEHYPERBLASTER:
begin
MSG_ReadPos(net_message, pos);
MSG_ReadPos(net_message, dir);
CL_BlasterParticles(pos, dir);
end;
TE_BLASTER:
begin // blaster hitting wall
MSG_ReadPos(net_message, pos);
MSG_ReadDir(net_message, dir);
CL_BlasterParticles(pos, dir);
ex := CL_AllocExplosion();
VectorCopy(pos, vec3_t(ex^.ent.origin));
ex^.ent.angles[0] := arccos(dir[2]) / M_PI * 180;
// PMM - fixed to correct for pitch of 0
if (dir[0] <> 0) then
// was ex^.ent.angles[1] := atan2(dir[1], dir[0])/M_PI*180
ex^.ent.angles[1] := ArcTan2(dir[1], dir[0]) / M_PI * 180 // ???
else if (dir[1] > 0) then
ex^.ent.angles[1] := 90
else if (dir[1] < 0) then
ex^.ent.angles[1] := 270
else
ex^.ent.angles[1] := 0;
ex^.type_ := ex_misc;
ex^.ent.flags := RF_FULLBRIGHT or RF_TRANSLUCENT;
ex^.start := cl.frame.servertime - 100;
ex^.light := 150;
ex^.lightcolor[0] := 1;
ex^.lightcolor[1] := 1;
ex^.ent.model := cl_mod_explode;
ex^.frames := 4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -