Skip to content

Commit

Permalink
See desc
Browse files Browse the repository at this point in the history
* first person spectate, press crouch(V) key to activate when dead or in
spectator mode, press LMB/RMB to switch between players
* clean up settings screen to allow for more
* read PacketExtInfo (ID 60)
  • Loading branch information
xtreme8000 committed Apr 3, 2019
1 parent 0f2648a commit 20668ba
Show file tree
Hide file tree
Showing 9 changed files with 191 additions and 159 deletions.
48 changes: 38 additions & 10 deletions src/cameracontroller.c
Expand Up @@ -19,6 +19,7 @@

#include "common.h"

int cameracontroller_bodyview_mode = 0;
int cameracontroller_bodyview_player = 0;
float cameracontroller_bodyview_zoom = 0.0F;

Expand Down Expand Up @@ -180,13 +181,40 @@ void cameracontroller_spectator(float dt) {
camera_movement_z = 0.0F;
}

camera_x += camera_movement_x;
camera_y += camera_movement_y;
camera_z += camera_movement_z;
camera_vx = camera_movement_x;
camera_vy = camera_movement_y;
camera_vz = camera_movement_z;
matrix_lookAt(camera_x,camera_y,camera_z,camera_x+sin(camera_rot_x)*sin(camera_rot_y),camera_y+cos(camera_rot_y),camera_z+cos(camera_rot_x)*sin(camera_rot_y),0.0F,1.0F,0.0F);
if(cameracontroller_bodyview_mode) {
//check if we cant spectate the player anymore
for(int k=0;k<PLAYERS_MAX*2;k++) { //a while(1) loop caused it to get stuck on map change when playing on babel
if(player_can_spectate(&players[cameracontroller_bodyview_player]))
break;
cameracontroller_bodyview_player = (cameracontroller_bodyview_player+1)%PLAYERS_MAX;
}
}

if(cameracontroller_bodyview_mode && players[cameracontroller_bodyview_player].alive) {
struct Player* p = &players[cameracontroller_bodyview_player];
camera_x = p->physics.eye.x;
camera_y = p->physics.eye.y+player_height(p);
camera_z = p->physics.eye.z;

camera_vx = p->physics.velocity.x;
camera_vy = p->physics.velocity.y;
camera_vz = p->physics.velocity.z;

float l = sqrt(distance3D(p->orientation_smooth.x,p->orientation_smooth.y,p->orientation_smooth.z,0,0,0));
float ox = p->orientation_smooth.x/l;
float oy = p->orientation_smooth.y/l;
float oz = p->orientation_smooth.z/l;

matrix_lookAt(camera_x,camera_y,camera_z,camera_x+ox,camera_y+oy,camera_z+oz,0.0F,1.0F,0.0F);
} else {
camera_x += camera_movement_x;
camera_y += camera_movement_y;
camera_z += camera_movement_z;
camera_vx = camera_movement_x;
camera_vy = camera_movement_y;
camera_vz = camera_movement_z;
matrix_lookAt(camera_x,camera_y,camera_z,camera_x+sin(camera_rot_x)*sin(camera_rot_y),camera_y+cos(camera_rot_y),camera_z+cos(camera_rot_x)*sin(camera_rot_y),0.0F,1.0F,0.0F);
}
}

void cameracontroller_bodyview(float dt) {
Expand Down Expand Up @@ -237,7 +265,7 @@ void cameracontroller_bodyview(float dt) {
camera_vy = players[cameracontroller_bodyview_player].physics.velocity.y;
camera_vz = players[cameracontroller_bodyview_player].physics.velocity.z;

/*if(players[cameracontroller_bodyview_player].alive) {
if(cameracontroller_bodyview_mode && players[cameracontroller_bodyview_player].alive) {
struct Player* p = &players[cameracontroller_bodyview_player];
camera_x = p->physics.eye.x;
camera_y = p->physics.eye.y+player_height(p);
Expand All @@ -253,15 +281,15 @@ void cameracontroller_bodyview(float dt) {
float oz = p->orientation_smooth.z/l;

matrix_lookAt(camera_x,camera_y,camera_z,camera_x+ox,camera_y+oy,camera_z+oz,0.0F,1.0F,0.0F);
} else {*/
} else {
matrix_lookAt(players[cameracontroller_bodyview_player].pos.x-sin(camera_rot_x)*sin(camera_rot_y)*cameracontroller_bodyview_zoom,
players[cameracontroller_bodyview_player].pos.y-cos(camera_rot_y)*cameracontroller_bodyview_zoom+player_height2(&players[cameracontroller_bodyview_player]),
players[cameracontroller_bodyview_player].pos.z-cos(camera_rot_x)*sin(camera_rot_y)*cameracontroller_bodyview_zoom,
players[cameracontroller_bodyview_player].pos.x,
players[cameracontroller_bodyview_player].pos.y+player_height2(&players[cameracontroller_bodyview_player]),
players[cameracontroller_bodyview_player].pos.z,
0.0F,1.0F,0.0F);
//}
}
}

void cameracontroller_selection(float dt) {
Expand Down
1 change: 1 addition & 0 deletions src/cameracontroller.h
Expand Up @@ -17,6 +17,7 @@
along with BetterSpades. If not, see <http://www.gnu.org/licenses/>.
*/

extern int cameracontroller_bodyview_mode;
extern int cameracontroller_bodyview_player;
extern float cameracontroller_bodyview_zoom;

Expand Down
142 changes: 94 additions & 48 deletions src/hud.c

Large diffs are not rendered by default.

46 changes: 14 additions & 32 deletions src/network.c
Expand Up @@ -372,6 +372,7 @@ void read_PacketExistingPlayer(void* data, int len) {
players[p->player_id].block.green = p->green;
players[p->player_id].block.blue = p->blue;
players[p->player_id].ammo = weapon_ammo(p->weapon);
players[p->player_id].ammo_reserved = weapon_ammo_reserved(p->weapon);
strcpy(players[p->player_id].name,p->name);
}
}
Expand Down Expand Up @@ -399,6 +400,7 @@ void read_PacketCreatePlayer(void* data, int len) {
players[p->player_id].block.green = 111;
players[p->player_id].block.blue = 111;
players[p->player_id].ammo = weapon_ammo(p->weapon);
players[p->player_id].ammo_reserved = weapon_ammo_reserved(p->weapon);
if(p->player_id==local_player_id) {
if(p->team==TEAM_SPECTATOR) {
camera_x = p->x;
Expand Down Expand Up @@ -683,7 +685,9 @@ void read_PacketWeaponReload(void* data, int len) {
sound_create(NULL,SOUND_WORLD,weapon_sound_reload(players[p->player_id].weapon),
players[p->player_id].pos.x,players[p->player_id].pos.y,players[p->player_id].pos.z
)->stick_to_player = p->player_id;
players[p->player_id].ammo = p->ammo;
//dont use values from packet which somehow are never correct
players[p->player_id].ammo = weapon_ammo(players[p->player_id].weapon);
players[p->player_id].ammo_reserved = weapon_ammo_reserved(players[p->player_id].weapon);
}
}

Expand Down Expand Up @@ -865,35 +869,15 @@ void read_PacketVersionGet(void* data, int len) {
network_send(PACKET_VERSIONSEND_ID,&ver,sizeof(ver)-sizeof(ver.operatingsystem)+strlen(os));
}

/*struct list network_list_kv6s;
struct list network_list_entities;
struct network_kv6 {
int id;
int size;
void* data;
kv6_t object;
};
struct network_entity {
int id;
float x,y,z;
unsigned char r,g,b;
float scale;
int kv6_id;
};
void read_PacketKv6Load(void* data, int len) {
struct PacketKv6Load* p = (struct PacketKv6Load*)data;
void read_PacketExtInfo(void* data, int len) {
struct PacketExtInfo* p = (struct PacketExtInfo*)data;
if(len>=p->length*sizeof(p->entries[0])+1) {
log_info("Server supports the following extensions:");
for(int k=0;k<p->length;k++)
log_info("Extension 0x%02X of version %i",p->entries[k].id,p->entries[k].version);
}
}

void read_PacketEntityCreate(void* data, int len) {
struct PacketEntityCreate* p = (struct PacketEntityCreate*)data;
struct network_entity e;
}*/

void network_updateColor() {
struct PacketSetColor c;
c.player_id = local_player_id;
Expand Down Expand Up @@ -1094,7 +1078,7 @@ int network_update() {
players[local_player_id].orientation.x,players[local_player_id].orientation.y,players[local_player_id].orientation.z)>0.5F/180.0F*PI) {
network_orient_update = window_time();
memcpy(&network_orient_last,&players[local_player_id].orientation,sizeof(struct Orientation));
struct PacketPositionData orient;
struct PacketOrientationData orient;
orient.x = players[local_player_id].orientation.x;
orient.y = players[local_player_id].orientation.z;
orient.z = -players[local_player_id].orientation.y;
Expand Down Expand Up @@ -1147,7 +1131,5 @@ void network_init() {
packets[PACKET_CHANGEWEAPON_ID] = read_PacketChangeWeapon;
packets[PACKET_HANDSHAKEINIT_ID] = read_PacketHandshakeInit;
packets[PACKET_VERSIONGET_ID] = read_PacketVersionGet;

/*packets[PACKET_KV6LOAD_ID] = read_PacketKv6Load;
packets[PACKET_ENTITYCREATE_ID] = read_PacketEntityCreate;*/
packets[PACKET_EXTINFO_ID] = read_PacketExtInfo;
}
51 changes: 7 additions & 44 deletions src/network.h
Expand Up @@ -406,50 +406,13 @@ struct PacketProgressBar {
float progress;
};

#define PACKET_ENTITYCREATE_ID 0xE0
struct PacketEntityCreate {
unsigned int entity_id;
float x,y,z;
float scale;
unsigned char r,g,b;
unsigned int kv6_id;
};

#define PACKET_ENTITYDESTROY_ID 0xE1
struct PacketEntityDestroy {
unsigned int entity_id;
};

#define PACKET_ENTITYMOVE_ID 0xE2
struct PacketEntityMove {
unsigned int entity_id;
float x,y,z;
};

#define PACKET_ENTITYVELOCITY_ID 0xE3
struct PacketEntityVelocity {
unsigned int entity_id;
float x,y,z;
};

#define PACKET_ENTITYROTATE_ID 0xE4
struct PacketEntityRotate {
unsigned int entity_id;
unsigned char absolute;
char x_rot, y_rot;
};

#define PACKET_ENTITYTEAM_ID 0xE5
struct PacketEntityTeam {
unsigned int entity_id;
unsigned char r,g,b;
};

#define PACKET_KV6LOAD_ID 0xE6
struct PacketKv6Load {
unsigned int kv6_id;
unsigned int data_size;
#define PACKET_EXTINFO_ID 60
struct PacketExtInfo {
unsigned char length;
struct {
unsigned char id;
unsigned char version;
} entries[256];
};


#pragma pack(pop)
32 changes: 20 additions & 12 deletions src/player.c
Expand Up @@ -326,7 +326,6 @@ void player_update(float dt) {
}
}
if(players[k].connected && k!=local_player_id) {
player_move(&players[k],dt,k);
if(camera_CubeInFrustum(players[k].pos.x,players[k].pos.y,players[k].pos.z,1.0F,2.0F)
&& distance2D(players[k].pos.x,players[k].pos.z,camera_x,camera_z)<=pow(settings.render_distance+2.0F,2.0F)) {
int intersections = player_render(&players[k],k,&ray,1);
Expand All @@ -351,6 +350,7 @@ void player_update(float dt) {
}
}
}
player_move(&players[k],dt,k);

if(players[k].alive && players[k].held_item==TOOL_GUN && players[k].input.buttons.lmb) {
if(window_time()-players[k].gun_shoot_timer>weapon_delay(players[k].weapon) && players[k].ammo>0) {
Expand Down Expand Up @@ -412,7 +412,7 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {
if(render)
kv6_calclight(p->pos.x,p->pos.y,p->pos.z);

if(camera_mode==CAMERAMODE_SPECTATOR && p->team!=TEAM_SPECTATOR && render) {
if(camera_mode==CAMERAMODE_SPECTATOR && p->team!=TEAM_SPECTATOR && render && !cameracontroller_bodyview_mode) {
int old_state = glx_fog;
if(old_state)
glx_disable_sphericalfog();
Expand Down Expand Up @@ -459,6 +459,10 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {
matrix_translate(p->pos.x,p->pos.y+0.25F,p->pos.z);
matrix_pointAt(ox,0.0F,oz);
matrix_rotate(90.0F,0.0F,1.0F,0.0F);
if(p->physics.velocity.y<0.05F && p->pos.y<1.5F) {
matrix_translate(0.0F,(sin(window_time()*1.5F)-1.0F)*0.15F,0.0F);
matrix_rotate(sin(window_time()*1.5F)*5.0F,1.0F,0.0F,0.0F);
}
matrix_upload();
kv6_render(&model_playerdead,p->team);
kv6_boundingbox(&model_playerdead,&p->bb_2d);
Expand Down Expand Up @@ -487,7 +491,10 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {

int intersections = 0;

if(id!=local_player_id || !p->alive || camera_mode!=CAMERAMODE_FPS) {
int render_body = (id!=local_player_id || !p->alive || camera_mode!=CAMERAMODE_FPS) && !((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode && cameracontroller_bodyview_player==id);
int render_fpv = (id==local_player_id && camera_mode==CAMERAMODE_FPS) || ((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode && cameracontroller_bodyview_player==id);

if(render_body) {
matrix_push();
matrix_translate(p->physics.eye.x,p->physics.eye.y+height,p->physics.eye.z);
float head_scale = sqrt(pow(p->orientation.x,2.0F)+pow(p->orientation.y,2.0F)+pow(p->orientation.z,2.0F));
Expand Down Expand Up @@ -580,14 +587,14 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {

matrix_push();
matrix_translate(p->physics.eye.x,p->physics.eye.y+height,p->physics.eye.z);
if(!(id==local_player_id && camera_mode==CAMERAMODE_FPS))
if(!render_fpv)
matrix_translate(0.0F,p->input.keys.crouch*0.1F-0.1F*2,0.0F);
matrix_pointAt(ox,oy,oz);
matrix_rotate(90.0F,0.0F,1.0F,0.0F);
if(id==local_player_id && camera_mode==CAMERAMODE_FPS)
if(render_fpv)
matrix_translate(0.0F,-2*0.1F,-2*0.1F);

if(id==local_player_id && p->alive) {
if(render_fpv && p->alive) {
float speed = sqrt(pow(p->physics.velocity.x,2)+pow(p->physics.velocity.z,2))/0.25F;
float* f = player_tool_translate_func(p);
matrix_translate(f[0],f[1],0.1F*player_swing_func(time/1000.0F)*speed+f[2]);
Expand All @@ -596,15 +603,15 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {
if(p->input.keys.sprint && !p->input.keys.crouch)
matrix_rotate(45.0F,1.0F,0.0F,0.0F);

if(id==local_player_id && window_time()-p->item_showup<0.5F)
if(render_fpv && window_time()-p->item_showup<0.5F)
matrix_rotate(45.0F-(window_time()-p->item_showup)*90.0F,1.0F,0.0F,0.0F);

if(!(p->held_item==TOOL_SPADE && id==local_player_id && camera_mode==CAMERAMODE_FPS)) {
if(!(p->held_item==TOOL_SPADE && render_fpv && camera_mode==CAMERAMODE_FPS)) {
float* angles = player_tool_func(p);
matrix_rotate(angles[0],1.0F,0.0F,0.0F);
matrix_rotate(angles[1],0.0F,1.0F,0.0F);
}
if(id!=local_player_id || settings.player_arms || camera_mode!=CAMERAMODE_FPS) {
if(render_body || settings.player_arms) {
if(render) {
matrix_upload();
kv6_render(&model_playerarms,p->team);
Expand All @@ -617,7 +624,7 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {

if(render) {
matrix_translate(-3.5F*0.1F+0.01F,0.0F,10*0.1F);
if(p->held_item==TOOL_SPADE && id==local_player_id && window_time()-p->item_showup>=0.5F && camera_mode==CAMERAMODE_FPS) {
if(p->held_item==TOOL_SPADE && render_fpv && window_time()-p->item_showup>=0.5F) {
float* angles = player_tool_func(p);
matrix_translate(0.0F,(model_spade.zpiv-model_spade.zsiz)*0.05F,0.0F);
matrix_rotate(angles[0],1.0F,0.0F,0.0F);
Expand All @@ -639,7 +646,7 @@ int player_render(struct Player* p, int id, Ray* ray, char render) {
case TOOL_GUN:
//matrix_translate(3.0F*0.1F-0.01F+0.025F,0.25F,-0.0625F);
//matrix_upload();
if((!(camera_mode==CAMERAMODE_FPS && players[local_player_id].input.buttons.rmb) && id==local_player_id) || id!=local_player_id) {
if(!(render_fpv && p->input.buttons.rmb)) {
switch(p->weapon) {
case WEAPON_RIFLE:
kv6_render(&model_semi,p->team);
Expand Down Expand Up @@ -984,7 +991,8 @@ int player_move(struct Player* p, float fsynctics, int id) {

if(p->input.keys.up || p->input.keys.down || p->input.keys.left || p->input.keys.right) {
if(window_time()-p->sound.feet_started>(p->input.keys.sprint?(0.5F/1.3F):0.5F)
&& (!p->input.keys.crouch && !p->input.keys.sneak) && !p->physics.airborne) {
&& (!p->input.keys.crouch && !p->input.keys.sneak) && !p->physics.airborne
&& pow(p->physics.velocity.x,2.0F)+pow(p->physics.velocity.z,2.0F)>pow(0.125F,2.0F)) {
struct Sound_wav* footstep[8] = {&sound_footstep1,&sound_footstep2,&sound_footstep3,&sound_footstep4,
&sound_wade1,&sound_wade2,&sound_wade3,&sound_wade4};
sound_create(NULL,local?SOUND_LOCAL:SOUND_WORLD,footstep[(rand()%4)+(p->physics.wade?4:0)],p->pos.x,p->pos.y,p->pos.z)->stick_to_player = id;
Expand Down
2 changes: 1 addition & 1 deletion src/player.h
Expand Up @@ -76,7 +76,7 @@ extern struct Player {
struct Position gun_pos;
struct Position casing_dir;
float gun_shoot_timer;
int ammo;
int ammo, ammo_reserved;
float spade_use_timer;
unsigned char spade_used, spade_use_type;
unsigned int score;
Expand Down

0 comments on commit 20668ba

Please sign in to comment.