From 20668bafde0f600c89507b43ceae51492952c57e Mon Sep 17 00:00:00 2001 From: xtreme8000 Date: Wed, 3 Apr 2019 18:00:16 +0200 Subject: [PATCH] See desc * 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) --- src/cameracontroller.c | 48 +++++++++++--- src/cameracontroller.h | 1 + src/hud.c | 142 +++++++++++++++++++++++++++-------------- src/network.c | 46 ++++--------- src/network.h | 51 ++------------- src/player.c | 32 ++++++---- src/player.h | 2 +- src/weapon.c | 27 ++++---- src/weapon.h | 1 + 9 files changed, 191 insertions(+), 159 deletions(-) diff --git a/src/cameracontroller.c b/src/cameracontroller.c index 457883a..c7cfb82 100644 --- a/src/cameracontroller.c +++ b/src/cameracontroller.c @@ -19,6 +19,7 @@ #include "common.h" +int cameracontroller_bodyview_mode = 0; int cameracontroller_bodyview_player = 0; float cameracontroller_bodyview_zoom = 0.0F; @@ -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;kphysics.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) { @@ -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); @@ -253,7 +281,7 @@ 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, @@ -261,7 +289,7 @@ void cameracontroller_bodyview(float dt) { 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) { diff --git a/src/cameracontroller.h b/src/cameracontroller.h index 6297a84..fae8384 100644 --- a/src/cameracontroller.h +++ b/src/cameracontroller.h @@ -17,6 +17,7 @@ along with BetterSpades. If not, see . */ +extern int cameracontroller_bodyview_mode; extern int cameracontroller_bodyview_player; extern float cameracontroller_bodyview_zoom; diff --git a/src/hud.c b/src/hud.c index 1a62665..f7864ff 100644 --- a/src/hud.c +++ b/src/hud.c @@ -453,12 +453,15 @@ static void hud_ingame_render(float scalex, float scalef) { glColor3f(1.0F,1.0F,1.0F); } - if(camera_mode==CAMERAMODE_FPS) { + int is_local = (camera_mode==CAMERAMODE_FPS) || (cameracontroller_bodyview_player==local_player_id); + int local_id = (camera_mode==CAMERAMODE_FPS)?local_player_id:cameracontroller_bodyview_player; + + if(camera_mode==CAMERAMODE_FPS || ((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode)) { glColor3f(1.0F,1.0F,1.0F); - if(players[local_player_id].held_item==TOOL_GUN && players[local_player_id].input.buttons.rmb) { + if(players[local_id].held_item==TOOL_GUN && players[local_id].input.buttons.rmb) { struct texture* zoom; - switch(players[local_player_id].weapon) { + switch(players[local_id].weapon) { case WEAPON_RIFLE: zoom = &texture_zoom_semi; break; @@ -469,7 +472,7 @@ static void hud_ingame_render(float scalex, float scalef) { zoom = &texture_zoom_shotgun; break; } - float zoom_factor = max(0.25F*(1.0F-((window_time()-weapon_last_shot)/weapon_delay(players[local_player_id].weapon)))+1.0F,1.0F); + float zoom_factor = max(0.25F*(1.0F-((window_time()-weapon_last_shot)/weapon_delay(players[local_id].weapon)))+1.0F,1.0F); texture_draw(zoom,(settings.window_width-settings.window_height*4.0F/3.0F*zoom_factor)/2.0F,settings.window_height*(zoom_factor*0.5F+0.5F),settings.window_height*4.0F/3.0F*zoom_factor,settings.window_height*zoom_factor); } else { texture_draw(&texture_target,(settings.window_width-16)/2.0F,(settings.window_height+16)/2.0F,16,16); @@ -480,13 +483,12 @@ static void hud_ingame_render(float scalex, float scalef) { texture_draw_rotated(&texture_indicator,settings.window_width/2.0F,settings.window_height/2.0F,200,200,ang); } - if(local_player_health<=30) { + if(local_player_health<=30 && is_local) glColor3f(1,0,0); - } else { + else glColor3f(1,1,1); - } char hp[4]; - sprintf(hp,"%i",local_player_health); + sprintf(hp,"%i",is_local?local_player_health:100); font_render(settings.window_width/2.0F-font_length(53.0F*scalef,hp),53.0F*scalef,53.0F*scalef,hp); texture_draw(&texture_health,settings.window_width/2.0F,44.0F*scalef,32.0F*scalef,32.0F*scalef); @@ -495,7 +497,7 @@ static void hud_ingame_render(float scalex, float scalef) { struct texture* item_mini; int off = 0; glColor3f(1.0F,1.0F,0.0F); - switch(players[local_player_id].held_item) { + switch(players[local_id].held_item) { default: case TOOL_BLOCK: off = 64*scalef; @@ -508,8 +510,11 @@ static void hud_ingame_render(float scalex, float scalef) { sprintf(item_mini_str,"%i",local_player_grenades); break; case TOOL_GUN: - sprintf(item_mini_str,"%i-%i",local_player_ammo,local_player_ammo_reserved); - switch(players[local_player_id].weapon) { + { + int ammo = is_local?local_player_ammo:players[local_id].ammo; + int ammo_reserve = is_local?local_player_ammo_reserved:players[local_id].ammo_reserved; + sprintf(item_mini_str,"%i-%i",ammo,ammo_reserve); + switch(players[local_id].weapon) { case WEAPON_RIFLE: item_mini = &texture_ammo_semi; break; @@ -520,20 +525,20 @@ static void hud_ingame_render(float scalex, float scalef) { item_mini = &texture_ammo_shotgun; break; } - if(local_player_ammo==0) { + if(ammo==0) glColor3f(1.0F,0.0F,0.0F); - } break; + } } texture_draw(item_mini,settings.window_width-44.0F*scalef-off,44.0F*scalef,32.0F*scalef,32.0F*scalef); font_render(settings.window_width-font_length(53.0F*scalef,item_mini_str)-44.0F*scalef-off,53.0F*scalef,53.0F*scalef,item_mini_str); glColor3f(1.0F,1.0F,1.0F); - if(players[local_player_id].held_item==TOOL_BLOCK) { + if(players[local_id].held_item==TOOL_BLOCK) { for(int y=0;y<8;y++) { for(int x=0;x<8;x++) { - if(texture_block_color(x,y)==players[local_player_id].block.packed) { + if(texture_block_color(x,y)==players[local_id].block.packed) { unsigned char g = (((int)(window_time()*4))&1)*0xFF; glColor3ub(g,g,g); texture_draw_empty(settings.window_width+(x*8-65)*scalef,(65-y*8)*scalef,8*scalef,8*scalef); @@ -985,7 +990,9 @@ static void hud_ingame_mouseclick(int button, int action, int mods) { } if(button==WINDOW_MOUSE_RMB && action==WINDOW_PRESS) { players[local_player_id].input.buttons.rmb_start = window_time(); - if(camera_mode==CAMERAMODE_BODYVIEW) { + if(camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) { + if(camera_mode==CAMERAMODE_SPECTATOR) + cameracontroller_bodyview_mode = 1; do { cameracontroller_bodyview_player = (cameracontroller_bodyview_player+1)%PLAYERS_MAX; } while(!player_can_spectate(&players[cameracontroller_bodyview_player])); @@ -1031,7 +1038,9 @@ static void hud_ingame_mouseclick(int button, int action, int mods) { } } - if(camera_mode==CAMERAMODE_BODYVIEW) { + if(camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) { + if(camera_mode==CAMERAMODE_SPECTATOR) + cameracontroller_bodyview_mode = 1; do { cameracontroller_bodyview_player = (cameracontroller_bodyview_player-1)%PLAYERS_MAX; if(cameracontroller_bodyview_player<0) @@ -1135,7 +1144,8 @@ static void hud_ingame_keyboard(int key, int action, int mods, int internal) { players[local_player_id].pos.z = 256.0F; } if(key==WINDOW_KEY_CROUCH) { - particle_create(0xFF00FF,players[local_player_id].pos.x,players[local_player_id].pos.y,players[local_player_id].pos.z,2.0F,1.0F,1024,0.1F,0.25F); + //particle_create(0xFF00FF,players[local_player_id].pos.x,players[local_player_id].pos.y,players[local_player_id].pos.z,2.0F,1.0F,1024,0.1F,0.25F); + players[local_player_id].alive = !players[local_player_id].alive; } } @@ -1229,6 +1239,10 @@ static void hud_ingame_keyboard(int key, int action, int mods, int internal) { weapon_reload(); } + if(key==WINDOW_KEY_SNEAK && (camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR)) { + cameracontroller_bodyview_mode = !cameracontroller_bodyview_mode; + } + if(screen_current==SCREEN_NONE && camera_mode==CAMERAMODE_FPS) { unsigned char tool_switch = 0; switch(key) { @@ -1845,6 +1859,14 @@ static void hud_settings_init() { chat[0][0][0] = 0; } +static int is_inside_centered(double mx, double my, int x, int y, int w, int h) { + return mx>=x-w/2 && mx=y-h/2 && my=x && mx=y && my0) + col_offset = ((k+1)&1)?314*scaley:0; + glColor3f(1.0F,1.0F,1.0F); - font_render((settings.window_width-600*scaley)/2.0F,(460-40*k)*scaley,16*scaley,a->name); + font_render((settings.window_width-600*scaley)/2.0F+col_offset,(460-40*row_offset)*scaley,16*scaley,a->name); char tmp[32]; switch(a->type) { case CONFIG_TYPE_STRING: glColor3f(1.0F,1.0F,1.0F); - texture_draw_sector(&texture_ui_input,(settings.window_width-600*scaley)/2.0F+174*scaley,(466-40*k)*scaley,8*scaley,32*scaley,0.0F,0.0F,0.25F,1.0F); - texture_draw_sector(&texture_ui_input,(settings.window_width-600*scaley)/2.0F+182*scaley,(466-40*k)*scaley,200*scaley,32*scaley,0.25F,0.0F,0.5F,1.0F); - texture_draw_sector(&texture_ui_input,settings.window_width/2.0F-300*scaley+382*scaley,(466-40*k)*scaley,8*scaley,32*scaley,0.75F,0.0F,0.25F,1.0F); + texture_draw_sector(&texture_ui_input,(settings.window_width-600*scaley)/2.0F+154*scaley+col_offset,(466-40*row_offset)*scaley,8*scaley,32*scaley,0.0F,0.0F,0.25F,1.0F); + texture_draw_sector(&texture_ui_input,(settings.window_width-600*scaley)/2.0F+162*scaley+col_offset,(466-40*row_offset)*scaley,200*scaley,32*scaley,0.25F,0.0F,0.5F,1.0F); + texture_draw_sector(&texture_ui_input,settings.window_width/2.0F-300*scaley+362*scaley+col_offset,(466-40*row_offset)*scaley,8*scaley,32*scaley,0.75F,0.0F,0.25F,1.0F); if(hud_settings_edit==a) glColor3f(1.0F,0.0F,0.0F); - font_render((settings.window_width-600*scaley)/2.0F+182*scaley,(460-40*k)*scaley,20*scaley,(hud_settings_edit==a)?chat[0][0]:a->value); + font_render((settings.window_width-600*scaley)/2.0F+162*scaley+col_offset,(460-40*row_offset)*scaley,20*scaley,(hud_settings_edit==a)?chat[0][0]:a->value); break; case CONFIG_TYPE_INT: glColor3f(1.0F,1.0F,1.0F); @@ -1886,37 +1914,49 @@ static void hud_settings_render(float scalex, float scaley) { sprintf(tmp,"%i",*(int*)a->value); if(a->max==1) { texture_draw_rotated(*(int*)a->value?&texture_ui_box_check:&texture_ui_box_empty, - (settings.window_width-600*scaley)/2.0F+240*scaley,(450-40*k)*scaley,32*scaley,32*scaley,0.0F); + (settings.window_width-600*scaley)/2.0F+220*scaley+col_offset,(450-40*row_offset)*scaley,32*scaley,32*scaley,0.0F); } else { - texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+290*scaley,(450-40*k)*scaley,32*scaley,32*scaley,0.0F); - texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+190*scaley,(450-40*k)*scaley,32*scaley,32*scaley,PI); + texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+270*scaley+col_offset,(450-40*row_offset)*scaley,32*scaley,32*scaley,0.0F); + texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+170*scaley+col_offset,(450-40*row_offset)*scaley,32*scaley,32*scaley,PI); if(hud_settings_edit==a) glColor3f(1.0F,0.0F,0.0F); - font_centered((settings.window_width-600*scaley)/2.0F+240*scaley,(460-40*k)*scaley,20*scaley,tmp); + font_centered((settings.window_width-600*scaley)/2.0F+220*scaley+col_offset,(460-40*row_offset)*scaley,20*scaley,tmp); } break; case CONFIG_TYPE_FLOAT: glColor3f(1.0F,1.0F,1.0F); - texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+290*scaley,(450-40*k)*scaley,32*scaley,32*scaley,0.0F); - texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+190*scaley,(450-40*k)*scaley,32*scaley,32*scaley,PI); + texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+270*scaley+col_offset,(450-40*row_offset)*scaley,32*scaley,32*scaley,0.0F); + texture_draw_rotated(&texture_ui_arrow,(settings.window_width-600*scaley)/2.0F+170*scaley+col_offset,(450-40*row_offset)*scaley,32*scaley,32*scaley,PI); if(hud_settings_edit==a) { glColor3f(1.0F,0.0F,0.0F); strcpy(tmp,chat[0][0]); } else { sprintf(tmp,"%0.2f",*(float*)a->value); } - font_centered((settings.window_width-600*scaley)/2.0F+240*scaley,(460-40*k)*scaley,20*scaley,tmp); + font_centered((settings.window_width-600*scaley)/2.0F+220*scaley+col_offset,(460-40*row_offset)*scaley,20*scaley,tmp); break; } } -} -static int is_inside_centered(double mx, double my, int x, int y, int w, int h) { - return mx>=x-w/2 && mx=y-h/2 && my=x && mx=y && my0) + col_offset = ((k+1)&1)?314*scaley:0; + + if(*a->help && is_inside(x,settings.window_height-y,(settings.window_width-600*scaley)/2.0F+col_offset,(435-40*row_offset)*scaley,300*scaley,32*scaley)) { + glColor3f(1.0F,1.0F,1.0F); + texture_draw_empty(x+5*scaley,settings.window_height-y+5*scaley,font_length(16*scaley,a->help)+10*scaley,26*scaley); + glColor3f(0.0F,0.0F,0.0F); + font_render(x+10*scaley,settings.window_height-y,16*scaley,a->help); + break; + } + } } static int is_int(const char* x) { @@ -2006,9 +2046,15 @@ static void hud_settings_mouseclick(int button, int action, int mods) { for(int k=0;k0) + col_offset = ((k+1)&1)?314*scaley:0; + if(is_inside_centered(x,y, - (settings.window_width-600*scaley)/2.0F+240*scaley, - (450-40*k)*scaley,68*scaley,32*scaley) + (settings.window_width-600*scaley)/2.0F+220*scaley+col_offset, + (450-40*row_offset)*scaley,68*scaley,32*scaley) && !(a->type==CONFIG_TYPE_INT && a->max==1)) { hud_settings_edit = a; switch(a->type) { @@ -2027,14 +2073,14 @@ static void hud_settings_mouseclick(int button, int action, int mods) { case CONFIG_TYPE_INT: if(a->max==1) { if(is_inside_centered(x,y, - (settings.window_width-600*scaley)/2.0F+240*scaley, - (450-40*k)*scaley,32*scaley,32*scaley)) { //checkbox pressed + (settings.window_width-600*scaley)/2.0F+220*scaley+col_offset, + (450-40*row_offset)*scaley,32*scaley,32*scaley)) { //checkbox pressed *(int*)a->value = !*(int*)a->value; } } else { if(is_inside_centered(x,y, - (settings.window_width-600*scaley)/2.0F+290*scaley, - (450-40*k)*scaley,32*scaley,32*scaley)) { //right arrow pressed + (settings.window_width-600*scaley)/2.0F+270*scaley+col_offset, + (450-40*row_offset)*scaley,32*scaley,32*scaley)) { //right arrow pressed int next = a->defaults_length?(*(int*)a->value):((*(int*)a->value)+1); int diff = INT_MAX; for(int l=0;ldefaults_length;l++) { @@ -2046,8 +2092,8 @@ static void hud_settings_mouseclick(int button, int action, int mods) { *(int*)a->value = min(next,a->max); } if(is_inside_centered(x,y, - (settings.window_width-600*scaley)/2.0F+190*scaley, - (450-40*k)*scaley,32*scaley,32*scaley)) { //left arrow pressed + (settings.window_width-600*scaley)/2.0F+170*scaley+col_offset, + (450-40*row_offset)*scaley,32*scaley,32*scaley)) { //left arrow pressed int next = a->defaults_length?(*(int*)a->value):((*(int*)a->value)-1); int diff = INT_MAX; for(int l=0;ldefaults_length;l++) { @@ -2062,13 +2108,13 @@ static void hud_settings_mouseclick(int button, int action, int mods) { break; case CONFIG_TYPE_FLOAT: if(is_inside_centered(x,y, - (settings.window_width-600*scaley)/2.0F+290*scaley, - (450-40*k)*scaley,32*scaley,32*scaley)) { //right arrow pressed + (settings.window_width-600*scaley)/2.0F+270*scaley+col_offset, + (450-40*row_offset)*scaley,32*scaley,32*scaley)) { //right arrow pressed *(float*)a->value = min((*(float*)a->value)+0.1F,a->max); } if(is_inside_centered(x,y, - (settings.window_width-600*scaley)/2.0F+190*scaley, - (450-40*k)*scaley,32*scaley,32*scaley)) { //left arrow pressed + (settings.window_width-600*scaley)/2.0F+170*scaley+col_offset, + (450-40*row_offset)*scaley,32*scaley,32*scaley)) { //left arrow pressed *(float*)a->value = max((*(float*)a->value)-0.1F,0); } break; diff --git a/src/network.c b/src/network.c index 2a94f93..0554714 100644 --- a/src/network.c +++ b/src/network.c @@ -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); } } @@ -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; @@ -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); } } @@ -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;klength;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; @@ -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; @@ -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; } diff --git a/src/network.h b/src/network.h index 66bddd4..5e0c050 100644 --- a/src/network.h +++ b/src/network.h @@ -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) diff --git a/src/player.c b/src/player.c index 01a2fdd..8185463 100644 --- a/src/player.c +++ b/src/player.c @@ -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); @@ -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) { @@ -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(); @@ -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); @@ -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)); @@ -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]); @@ -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); @@ -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); @@ -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); @@ -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; diff --git a/src/player.h b/src/player.h index 2e0217f..2151648 100644 --- a/src/player.h +++ b/src/player.h @@ -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; diff --git a/src/weapon.c b/src/weapon.c index 0144a12..0427c48 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -192,6 +192,19 @@ int weapon_ammo(int gun) { } } +int weapon_ammo_reserved(int gun) { + switch(gun) { + case WEAPON_RIFLE: + return 50; + case WEAPON_SMG: + return 120; + case WEAPON_SHOTGUN: + return 48; + default: + return 0; + } +} + struct kv6_t* weapon_casing(int gun) { switch(gun) { case WEAPON_RIFLE: @@ -208,18 +221,8 @@ struct kv6_t* weapon_casing(int gun) { void weapon_set() { //players[local_player_id].weapon = WEAPON_SHOTGUN; local_player_ammo = weapon_ammo(players[local_player_id].weapon); + local_player_ammo_reserved = weapon_ammo_reserved(players[local_player_id].weapon); weapon_reload_inprogress = 0; - switch(players[local_player_id].weapon) { - case WEAPON_RIFLE: - local_player_ammo_reserved = 50; - return; - case WEAPON_SMG: - local_player_ammo_reserved = 120; - return; - case WEAPON_SHOTGUN: - local_player_ammo_reserved = 48; - return; - } } void weapon_reload() { @@ -286,7 +289,7 @@ void weapon_shoot() { network_buttons_last = players[local_player_id].input.buttons.packed; } - 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; diff --git a/src/weapon.h b/src/weapon.h index d302937..a0d2f0e 100644 --- a/src/weapon.h +++ b/src/weapon.h @@ -27,6 +27,7 @@ void weapon_shoot(void); int weapon_block_damage(int gun); float weapon_delay(int gun); int weapon_ammo(int gun); +int weapon_ammo_reserved(int gun); struct kv6_t* weapon_casing(int gun); float weapon_recoil_anim(int gun); struct Sound_wav* weapon_sound(int gun);