diff --git a/Source/client/chat.c b/Source/client/chat.c new file mode 100644 index 00000000..7ca56ff5 --- /dev/null +++ b/Source/client/chat.c @@ -0,0 +1,62 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +#define CHAT_LINES 5 +#define CHAT_TIME 5 + +var float g_chattime; +var int g_chatlines = -1; +string g_chatbuffer[CHAT_LINES]; + +/* +================= +Chat_Draw + +Just prints whatever is in the chat buffer and removes lines after some time. +================= +*/ +void Chat_Draw(void) +{ + vector pos = video_mins + [16, video_res_y - 128]; + + if (g_chatlines < 0) { + return; + } + + // Remove messages after a g_chattime has passed + if (g_chattime < time) { + g_chatbuffer[g_chatlines] = __NULL__; + g_chatlines--; + g_chattime = time + CHAT_TIME; + } + + + for (int i = 0; i < CHAT_LINES; i++) { + drawstring(pos, g_chatbuffer[i], [12,12], [1,1,1], 1.0f, 0); + pos_y += 14; + } +} + +void Chat_Parse(string msg) +{ + if (g_chatlines < (CHAT_LINES - 1)) { + g_chatbuffer[g_chatlines + 1] = msg; + g_chatlines++; + } else { + for (int i = 0; i < (CHAT_LINES - 1); i++) { + g_chatbuffer[i] = g_chatbuffer[i + 1]; + } + g_chatbuffer[CHAT_LINES - 1] = msg; + } + + g_chattime = time + CHAT_TIME; + + // Log to console + localcmd(sprintf("echo \"%s\"\n", msg)); + sound(self, CHAN_ITEM, "misc/talk.wav", 1.0, ATTN_NONE); +} diff --git a/Source/client/cstrike.src b/Source/client/cstrike.src index afe95f57..1138199e 100755 --- a/Source/client/cstrike.src +++ b/Source/client/cstrike.src @@ -16,7 +16,7 @@ cstrike/defs.h defs.h vgui.h -hud_voice.c +voice.c sound.c text.c @@ -59,7 +59,7 @@ text.c ../shared/spraylogo.cpp cstrike/overview.c -cstrike/player.c +../shared/valve/player.cpp player.c predict.c events.c @@ -74,6 +74,7 @@ cstrike/vguiteamselect.c cstrike/vguiradio.c cstrike/vgui.c damage.c +chat.c cstrike/nightvision.c cstrike/hudcrosshair.c cstrike/hudscope.c @@ -85,7 +86,9 @@ cstrike/entities.c cstrike/event.c cstrike/init.c +cstrike/player.c entities.c +cstrike/input.c entry.c #endlist diff --git a/Source/client/cstrike/defs.h b/Source/client/cstrike/defs.h index afdf831e..ff0f7923 100755 --- a/Source/client/cstrike/defs.h +++ b/Source/client/cstrike/defs.h @@ -115,9 +115,6 @@ struct // Sound Stuff //.string sSoundSample; //.float fVolume; - -void View_AddPunchAngle( vector vAdd ); -void View_PlayAnimation( int iSequence ); string HUD_GetChatColorHEX( float fTeam ); // For the player entity diff --git a/Source/client/cstrike/draw.c b/Source/client/cstrike/draw.c index c7590f27..9034ae2e 100755 --- a/Source/client/cstrike/draw.c +++ b/Source/client/cstrike/draw.c @@ -6,138 +6,6 @@ * ****/ -#define CHAT_LINES 5 -#define CHAT_TIME 20 -var int iLineScroll = 0; - -float fChatTime; -float fChatAlpha; -string sMSGBuffer[CHAT_LINES]; - -/* -================= -CSQC_Parse_Print - -Receives a message and sorts it into the chat messagebuffer -================= -*/ -void CSQC_Parse_Print(string sMessage, float fLevel) { - // This gives messages other than chat an orange tint - if (fLevel != PRINT_CHAT) { - sMessage = sprintf("^xF80%s", sMessage); - } - - if (iLineScroll < (CHAT_LINES - 1)) { - sMSGBuffer[iLineScroll + 1] = sMessage; - iLineScroll++; - } else { - for (int i = 0; i < (CHAT_LINES - 1); i++) { - sMSGBuffer[i] = sMSGBuffer[i + 1]; - } - sMSGBuffer[CHAT_LINES - 1] = sMessage; - } - - fChatTime = time + CHAT_TIME; - fChatAlpha = 1.0f; - - // Log to console - localcmd(sprintf("echo \"%s\"\n", sMessage)); -} - -/* -================= -CSQC_DrawChat - -Just prints whatever is in the chat buffer and removes lines after some time. -================= -*/ -void CSQC_DrawChat(void) { - vector vChatPos = video_mins + [16, video_res_y - 128]; - - // Remove messages after a fChatTime has passed - if (fChatTime < time) { - fChatAlpha -= frametime; - } else { - fChatAlpha = 1.0f; - } - - if (fChatAlpha > 0.0f) { -#if 1 - for (int i = 0; i < CHAT_LINES; i++) { - drawstring(vChatPos, sMSGBuffer[i], '12 12', '1 1 1', fChatAlpha, 0); - vChatPos_y += 14; - } -#else - string sDraw = sMSGBuffer[0]; - for (int i = 1; i < CHAT_LINES; i++) { - sDraw = sprintf("%s\n%s\n", sDraw, sMSGBuffer[i]); - } - - drawtextfield(vChatPos, [video_res_x - 32, CHAT_LINES * 12], 1, sDraw); -#endif - } -} - -/* -================= -CSQC_DrawCenterprint - -Read centerprints from a buffer and display them with alpha and whatnot -================= -*/ -float fCenterPrintAlpha; -float fCenterPrintTime; -float fCenterPrintLines; -string sCenterPrintBuffer[18]; - -void CSQC_DrawCenterprint(void) { - if (fCenterPrintAlpha <= 0) { - return; - } - - vector vCenterPrintPos; - - if (fCenterPrintTime > time) { - fCenterPrintAlpha = 1; - } else { - fCenterPrintAlpha -= frametime; - - if (fCenterPrintAlpha < 0) { - fCenterPrintAlpha = 0; - } - } - - vCenterPrintPos_y = video_mins_y + (video_res_y / 2) - (fCenterPrintLines - 4) - 69; - - for (int i = 0; i < (fCenterPrintLines); i++) { - vCenterPrintPos_x = video_mins_x + (video_res_x / 2) - (stringwidth(sCenterPrintBuffer[i], TRUE, '12 12') / 2); - drawstring(vCenterPrintPos, sCenterPrintBuffer[i], '12 12', '1 1 1', fCenterPrintAlpha, 0); - vCenterPrintPos_y += 8; - } -} - -/* -================= -CSQC_Parse_CenterPrint - -Catches every centerprint call and allows us to tinker with it. -That's how we are able to add color, alpha and whatnot. -Keep in mind that newlines need to be tokenized -================= -*/ -float CSQC_Parse_CenterPrint(string sMessage) { - fCenterPrintLines = tokenizebyseparator(sMessage, "\n"); - - for(int i = 0; i < (fCenterPrintLines); i++) { - sCenterPrintBuffer[i] = sprintf("^xF80%s", argv(i)); - } - - fCenterPrintAlpha = 1; - fCenterPrintTime = time + 3; - - return TRUE; -} - /* ================= CSQC_UpdateView diff --git a/Source/client/cstrike/event.c b/Source/client/cstrike/event.c index c8541f09..b42c019a 100755 --- a/Source/client/cstrike/event.c +++ b/Source/client/cstrike/event.c @@ -15,39 +15,16 @@ Init all the cmds in one place */ void CSQC_ConsoleCommand_Init(void) { - registercommand("slot1"); - registercommand("slot2"); - registercommand("slot3"); - registercommand("slot4"); - registercommand("slot5"); - registercommand("slot6"); - registercommand("slot7"); - registercommand("slot8"); - registercommand("slot9"); - registercommand("slot10"); registercommand("dev_testorbituary"); registercommand("minimap"); registercommand("overview_test"); - registercommand("vox_test"); - registercommand("+attack2"); - registercommand("-attack2"); - registercommand("+reload"); - registercommand("-reload"); - registercommand("+use"); - registercommand("-use"); - registercommand("+duck"); - registercommand("-duck"); registercommand("buy"); registercommand("chooseteam"); - registercommand("lastinv"); - registercommand("invnext"); - registercommand("invprev"); - registercommand("+showscores"); - registercommand("-showscores"); - registercommand("nightvision"); + registercommand("drop"); + registercommand("nightvision"); registercommand("radio1"); registercommand("radio2"); @@ -123,39 +100,6 @@ float Game_ConsoleCommand(void) { /* This has already been tokenized */ switch (argv(0)) { - case "lastinv": - HUD_DrawWeaponSelect_Last(); - break; - case "slot1": - localcmd("impulse 1\n"); - break; - case "slot2": - localcmd("impulse 2\n"); - break; - case "slot3": - localcmd("impulse 3\n"); - break; - case "slot4": - localcmd("impulse 4\n"); - break; - case "slot5": - localcmd("impulse 5\n"); - break; - case "slot6": - localcmd("impulse 6\n"); - break; - case "slot7": - localcmd("impulse 7\n"); - break; - case "slot8": - localcmd("impulse 8\n"); - break; - case "slot9": - localcmd("impulse 9\n"); - break; - case "slot10": - localcmd("impulse 10\n"); - break; case "dev_testorbituary": HUD_AddOrbituaries(player_localnum, TEAM_T, player_localnum, TEAM_CT, floor(random(1, CS_WEAPON_COUNT)), FALSE); break; @@ -173,18 +117,6 @@ float Game_ConsoleCommand(void) case "chooseteam": pSeat->fVGUI_Display = VGUI_TEAMSELECT; break; - case "invnext": - HUD_DrawWeaponSelect_Back(); - break; - case "invprev": - HUD_DrawWeaponSelect_Forward(); - break; - case "+showscores": - pSeat->iShowScores = TRUE; - break; - case "-showscores": - pSeat->iShowScores = FALSE; - break; case "nightvision": Nightvision_Toggle(); break; diff --git a/Source/client/cstrike/hud.c b/Source/client/cstrike/hud.c index 335b915c..c2095385 100755 --- a/Source/client/cstrike/hud.c +++ b/Source/client/cstrike/hud.c @@ -69,8 +69,6 @@ void HUD_Init(void) precache_model("sprites/640hud14.spr"); precache_model("sprites/640hud3.spr"); precache_model("sprites/640hud5.spr"); - precache_model("sprites/640_pain.spr"); - precache_model("sprites/crosshairs.spr"); } /* diff --git a/Source/client/cstrike/init.c b/Source/client/cstrike/init.c index a6f07446..b1d7f169 100755 --- a/Source/client/cstrike/init.c +++ b/Source/client/cstrike/init.c @@ -38,7 +38,6 @@ void Client_Init(float apilevel, string enginename, float engineversion) PARTICLE_SMOKEGRENADE = particleeffectnum("smokegren"); Radio_InitSounds(); - CSQC_ConsoleCommand_Init(); CSQC_VGUI_Init(); Overview_Init(); diff --git a/Source/client/cstrike/input.c b/Source/client/cstrike/input.c new file mode 100644 index 00000000..bf9ac663 --- /dev/null +++ b/Source/client/cstrike/input.c @@ -0,0 +1,12 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +void Game_Input(void) +{ + +} diff --git a/Source/client/cstrike/player.c b/Source/client/cstrike/player.c index 1f22cad6..21ea0ed9 100755 --- a/Source/client/cstrike/player.c +++ b/Source/client/cstrike/player.c @@ -43,3 +43,37 @@ string sPModels[CS_WEAPON_COUNT - 1] = { "models/p_hegrenade.mdl", "models/p_smokegrenade.mdl" }; + +void Player_ReadEntity(float flIsNew) +{ + player pl = (player)self; + + if ( flIsNew == TRUE ) { + spawnfunc_player(); + + pl.classname = "player"; + pl.solid = SOLID_SLIDEBOX; + pl.drawmask = MASK_ENGINE; + pl.customphysics = Empty; + setsize( pl, VEC_HULL_MIN, VEC_HULL_MAX ); + } + + pl.modelindex = readshort(); + pl.origin[0] = readcoord(); + pl.origin[1] = readcoord(); + pl.origin[2] = readcoord(); + pl.pitch = readcoord() / 90; + pl.angles[1] = readcoord(); + pl.angles[2] = readcoord(); + pl.velocity[0] = readcoord(); + pl.velocity[1] = readcoord(); + pl.velocity[2] = readcoord(); + pl.flags = readfloat(); + pl.pmove_flags = readfloat(); + pl.weapon = readbyte(); + pl.health = readbyte(); + pl.movetype = readfloat(); + pl.view_ofs[2] = readfloat(); + pl.viewzoom = readfloat(); + setorigin( pl, pl.origin ); +} diff --git a/Source/client/defs.h b/Source/client/defs.h index 1ed238d6..817d1565 100644 --- a/Source/client/defs.h +++ b/Source/client/defs.h @@ -13,10 +13,10 @@ #define DRAWFLAG_2XMODULATE 3 // Undocumented printcall types -#define PRINT_LOW 0 -#define PRINT_MEDIUM 1 -#define PRINT_HIGH 2 -#define PRINT_CHAT 3 +#define PRINT_LOW 0 +#define PRINT_MEDIUM 1 +#define PRINT_HIGH 2 +#define PRINT_CHAT 3 var float FONT_16; var float FONT_20; @@ -31,7 +31,7 @@ var float autocvar_cl_bob = 0; var float autocvar_v_bob = 0.01; var float autocvar_v_bobcycle = 0.8; var float autocvar_v_bobup = 0.5; -var int autocvar_v_bobclassic = FALSE; +var int autocvar_v_bobclassic = TRUE; var vector autocvar_v_gunofs = [0,0,0]; var int autocvar_cl_thirdperson = FALSE; var int autocvar_cl_smoothstairs = TRUE; @@ -73,4 +73,10 @@ vector mouse_pos; float clframetime; + +void View_AddPunchAngle( vector vAdd ); +void View_PlayAnimation( int iSequence ); +void Game_Input(void); + + int(float playernum, string keyname, optional void *outptr, int size) getplayerkeyblob = #0; diff --git a/Source/client/entities.c b/Source/client/entities.c index 2c2a6f3c..345b9e51 100644 --- a/Source/client/entities.c +++ b/Source/client/entities.c @@ -18,36 +18,7 @@ void CSQC_Ent_Update(float flIsNew) float fEntType = readbyte(); if ( fEntType == ENT_PLAYER ) { - player pl = (player)self; - - if ( flIsNew == TRUE ) { - spawnfunc_player(); - - pl.classname = "player"; - pl.solid = SOLID_SLIDEBOX; - pl.drawmask = MASK_ENGINE; - pl.customphysics = Empty; - setsize( pl, VEC_HULL_MIN, VEC_HULL_MAX ); - } - - pl.modelindex = readshort(); - pl.origin[0] = readcoord(); - pl.origin[1] = readcoord(); - pl.origin[2] = readcoord(); - pl.pitch = readcoord() / 90; - pl.angles[1] = readcoord(); - pl.angles[2] = readcoord(); - pl.velocity[0] = readcoord(); - pl.velocity[1] = readcoord(); - pl.velocity[2] = readcoord(); - pl.flags = readfloat(); - pl.pmove_flags = readfloat(); - pl.weapon = readbyte(); - pl.health = readbyte(); - pl.movetype = readfloat(); - pl.view_ofs[2] = readfloat(); - pl.viewzoom = readfloat(); - setorigin( pl, pl.origin ); + Player_ReadEntity(flIsNew); } else if ( fEntType == ENT_SPRITE ) { Sprite_Animated(); } else if ( fEntType == ENT_SPRAY ) { diff --git a/Source/client/entry.c b/Source/client/entry.c index dd8f592c..9b4cf556 100644 --- a/Source/client/entry.c +++ b/Source/client/entry.c @@ -10,6 +10,35 @@ void CSQC_Init(float apilevel, string enginename, float engineversion) { pSeat = &seats[0]; + registercommand("vox_test"); + registercommand("+attack2"); + registercommand("-attack2"); + registercommand("+reload"); + registercommand("-reload"); + registercommand("+use"); + registercommand("-use"); + registercommand("+duck"); + registercommand("-duck"); + + registercommand("slot1"); + registercommand("slot2"); + registercommand("slot3"); + registercommand("slot4"); + registercommand("slot5"); + registercommand("slot6"); + registercommand("slot7"); + registercommand("slot8"); + registercommand("slot9"); + registercommand("slot10"); + registercommand("lastinv"); + registercommand("invnext"); + registercommand("invprev"); + registercommand("+showscores"); + registercommand("-showscores"); + + precache_model("sprites/640_pain.spr"); + precache_model("sprites/crosshairs.spr"); + /* Fonts */ FONT_16 = loadfont("16", "fonts/default", "16", -1); FONT_CON = loadfont("font", "", "12", -1); @@ -37,6 +66,9 @@ void CSQC_Init(float apilevel, string enginename, float engineversion) /* VOX */ Sound_InitVOX(); + + /* View */ + View_Init(); /* Effects */ precache_sound("debris/bustglass1.wav"); @@ -159,14 +191,15 @@ void CSQC_UpdateView(float w, float h, float focus) // The spectator sees things... differently if (getplayerkeyvalue(player_localnum, "*spec") != "0") { - ///VGUI_DrawSpectatorHUD(); + VGUI_DrawSpectatorHUD(); } else { HUD_Draw(); } ///HUD_DrawOrbituaries(); Voice_DrawHUD(); - ///CSQC_DrawChat(); + Chat_Draw(); + Print_Draw(); #ifdef CSTRIKE // Don't even try to draw centerprints and VGUI menus when scores are shown @@ -191,9 +224,6 @@ void CSQC_UpdateView(float w, float h, float focus) } Sound_ProcessWordQue(); - - CSQC_DrawText([16,16], "THIS IS A TEST.\n", [20,20], [1,1,1], 1.0f, - 0, FONT_20); } /* @@ -264,7 +294,7 @@ void CSQC_Input_Frame(void) int s = (float)getproperty(VF_ACTIVESEAT); pSeat = &seats[s]; -#ifdef CSTRIKE + // If we are inside a VGUI, don't let the client do stuff outside if ((pSeat->fVGUI_Display != VGUI_NONE)) { fInputSendNext = time + 0.2; @@ -273,7 +303,7 @@ void CSQC_Input_Frame(void) input_buttons = 0; fInputSendNext = time + 0.2; } -#endif + if (fInputSendNext > time) { input_impulse = 0; @@ -305,8 +335,9 @@ void CSQC_Input_Frame(void) if (iInputDuck == TRUE) { input_buttons |= INPUT_BUTTON8; } - + input_angles += pSeat->vPunchAngle; + Game_Input(); } @@ -437,12 +468,105 @@ float CSQC_ConsoleCommand(string sCMD) case "-duck": iInputDuck = FALSE; break; + case "invnext": + HUD_DrawWeaponSelect_Back(); + break; + case "invprev": + HUD_DrawWeaponSelect_Forward(); + break; + case "lastinv": + HUD_DrawWeaponSelect_Last(); + break; + case "+showscores": + pSeat->iShowScores = TRUE; + break; + case "-showscores": + pSeat->iShowScores = FALSE; + break; + case "slot1": + localcmd("impulse 1\n"); + break; + case "slot2": + localcmd("impulse 2\n"); + break; + case "slot3": + localcmd("impulse 3\n"); + break; + case "slot4": + localcmd("impulse 4\n"); + break; + case "slot5": + localcmd("impulse 5\n"); + break; + case "slot6": + localcmd("impulse 6\n"); + break; + case "slot7": + localcmd("impulse 7\n"); + break; + case "slot8": + localcmd("impulse 8\n"); + break; + case "slot9": + localcmd("impulse 9\n"); + break; + case "slot10": + localcmd("impulse 10\n"); + break; default: return Game_ConsoleCommand(); } return TRUE; } +void CSQC_Parse_Print(string sMessage, float fLevel) +{ + // This gives messages other than chat an orange tint + if (fLevel == PRINT_CHAT) { + Chat_Parse(sMessage); + return; + } + + if (g_printlines < (4)) { + g_printbuffer[g_printlines + 1] = sMessage; + g_printlines++; + } else { + for (int i = 0; i < (4); i++) { + g_printbuffer[i] = g_printbuffer[i + 1]; + } + g_printbuffer[4] = sMessage; + } + + g_printtime = time + CHAT_TIME; + + // Log to console + localcmd(sprintf("echo \"%s\"\n", sMessage)); +} + + +/* +================= +CSQC_Parse_CenterPrint + +Catches every centerprint call and allows us to tinker with it. +That's how we are able to add color, alpha and whatnot. +Keep in mind that newlines need to be tokenized +================= +*/ +float CSQC_Parse_CenterPrint(string sMessage) +{ + fCenterPrintLines = tokenizebyseparator(sMessage, "\n"); + + for(int i = 0; i < (fCenterPrintLines); i++) { + sCenterPrintBuffer[i] = sprintf("^xF80%s", argv(i)); + } + + fCenterPrintAlpha = 1; + fCenterPrintTime = time + 3; + + return TRUE; +} + /* ================= CSQC_WorldLoaded @@ -452,7 +576,16 @@ Whenever the world is fully initialized... */ void CSQC_WorldLoaded(void) { - + /*precache_pic("{shot1", TRUE); + precache_pic("{shot2", TRUE); + precache_pic("{shot3", TRUE); + precache_pic("{shot4", TRUE); + precache_pic("{shot5", TRUE); + precache_pic("{bigshot1", TRUE); + precache_pic("{bigshot2", TRUE); + precache_pic("{bigshot3", TRUE); + precache_pic("{bigshot4", TRUE); + precache_pic("{bigshot5", TRUE);*/ } /* diff --git a/Source/client/events.c b/Source/client/events.c index f4a1d7df..f451980c 100644 --- a/Source/client/events.c +++ b/Source/client/events.c @@ -13,8 +13,9 @@ View_ShellEject Spawns a shell tempentity. Looking fancy ==================== */ -void Event_EjectShell( void ) { - static void Event_EjectShell_Death( void ) { +void Event_EjectShell(void) +{ + static void Event_EjectShell_Death(void) { remove( self ); } vector vOrigin = pSeat->vPlayerOrigin; @@ -45,7 +46,8 @@ Called by the engine whenever a model tries to play an event. ==================== */ -void Event_ProcessModel( float fTimeStamp, int iCode, string sData ) { +void Event_ProcessModel( float fTimeStamp, int iCode, string sData ) +{ if ( iCode == 5004 ) { localsound( sData, CHAN_AUTO, 1.0 ); } else if ( iCode == 5001 ) { diff --git a/Source/client/player.c b/Source/client/player.c index b7ae411b..c12cb078 100644 --- a/Source/client/player.c +++ b/Source/client/player.c @@ -6,31 +6,6 @@ * ****/ -class player -{ - entity p_model; - int p_hand_bone; - int p_model_bone; - - vector netorigin; - vector netvelocity; - float netflags; - - float weapon; - float lastweapon; - - float health; - float armor; - float pitch; - float viewzoom; - - vector view_ofs; - - virtual void() gun_offset; - virtual void() draw; - virtual float() predraw; -}; - //.float bonecontrol1; //Halflife model format bone controller. On player models, this typically affects the spine's yaw. //.float bonecontrol2; //Halflife model format bone controller. On player models, this typically affects the spine's yaw. //.float bonecontrol3; //Halflife model format bone controller. On player models, this typically affects the spine's yaw. @@ -67,13 +42,13 @@ void player::draw(void) this.subblend2frac = this.pitch; // Only bother updating the model if the weapon has changed - if (this.lastweapon != this.weapon) { - if (this.weapon) { + if (this.lastweapon != this.activeweapon) { + if (this.activeweapon) { // FIXME: setmodel(this.p_model, sPModels[this.weapon - 1]); } else { setmodel(this.p_model, ""); } - this.lastweapon = this.weapon; + this.lastweapon = this.activeweapon; // Update the bone index of the current p_ model so we can calculate the offset // Get the weapon bone ID for the current player model @@ -81,7 +56,7 @@ void player::draw(void) this.p_model_bone = gettagindex(this.p_model, "Bip01 R Hand"); } - //Animation_PlayerUpdate(); + Animation_PlayerUpdate(); /*makevectors([0, this.angles[1], 0]); float fDirection = dotproduct(this.velocity, v_forward); diff --git a/Source/client/predict.c b/Source/client/predict.c index 2285c5d3..0f1bcc84 100644 --- a/Source/client/predict.c +++ b/Source/client/predict.c @@ -20,6 +20,12 @@ void Predict_PreFrame(player pl) pl.netorigin = pl.origin; pl.netvelocity = pl.velocity; pl.netflags = pl.flags; + +#ifdef VALVE + pl.net_w_attack_next = pl.w_attack_next; + pl.net_w_idle_next = pl.w_idle_next; +#endif + //self.netpmove_flags = self.pmove_flags; //we want to predict an exact copy of the data in the new packet @@ -57,6 +63,12 @@ void Predict_PostFrame(player pl) pl.origin = pl.netorigin; pl.velocity = pl.netvelocity; pl.flags = pl.netflags; + +#ifdef VALVE + pl.w_attack_next = pl.net_w_attack_next; + pl.w_idle_next = pl.net_w_idle_next; +#endif + //self.pmove_flags = self.netpmove_flags; setorigin(pl, pl.origin); //self.pmove_frame = servercommandframe + 1; diff --git a/Source/client/sound.c b/Source/client/sound.c index d39f9bb4..e67a822b 100755 --- a/Source/client/sound.c +++ b/Source/client/sound.c @@ -16,32 +16,32 @@ var int iVOXCount; var int iVOXPos; var float fSampleTime = 0.0f; -void Sound_PlayVOX( string sMessage ) { - if ( iVOXCount ) { +void Sound_PlayVOX(string msg) { + if (iVOXCount) { return; } - iVOXCount = tokenize( sMessage ); - sndVOX = memalloc( sizeof( sound_t ) * iVOXCount ); + iVOXCount = tokenize(msg); + sndVOX = memalloc(sizeof(sound_t) * iVOXCount); - for ( int i = 0; i < iVOXCount; i++ ) { - sndVOX[i].sSample = sprintf( "vox/%s.wav", argv( i ) ); - sndVOX[i].fLength = soundlength( sndVOX[i].sSample ); + for (int i = 0; i < iVOXCount; i++) { + sndVOX[i].sSample = sprintf("vox/%s.wav", argv(i)); + sndVOX[i].fLength = soundlength(sndVOX[i].sSample); } fSampleTime = time; } -void Sound_ProcessWordQue( void ) { - if ( cltime < 2 ) { +void Sound_ProcessWordQue(void) { + if (cltime < 2) { return; } - if ( iVOXCount ) { - if ( fSampleTime < time ) { - localcmd( sprintf( "play %s\n", sndVOX[ iVOXPos ].sSample ) ); + if (iVOXCount) { + if (fSampleTime < time) { + localcmd(sprintf("play %s\n", sndVOX[ iVOXPos ].sSample)); iVOXPos++; - if ( iVOXPos == iVOXCount ) { - memfree( sndVOX ); + if (iVOXPos == iVOXCount) { + memfree(sndVOX); iVOXCount = 0; iVOXPos = 0; } else { diff --git a/Source/client/text.c b/Source/client/text.c index a5ff063f..58c48e76 100644 --- a/Source/client/text.c +++ b/Source/client/text.c @@ -6,9 +6,80 @@ * ****/ +float g_printtime; +string g_printbuffer[5]; +var int g_printlines = -1; + void CSQC_DrawText(vector pos, string txt, vector sz, vector col, float a, float fl, float fnt) { drawfont = fnt; drawstring(pos, txt, sz, col, a, fl); } + +/* +================= +Chat_Draw + +Just prints whatever is in the chat buffer and removes lines after some time. +================= +*/ +void Print_Draw(void) { + vector pos = video_mins + [16, 16]; + + if (g_printlines < 0) { + return; + } + + // Remove messages after a g_chattime has passed + if (g_printtime < time) { + g_printbuffer[g_printlines] = __NULL__; + g_printlines--; + g_printtime = time + 5; + } + + + for (int i = 0; i < 5; i++) { + drawstring(pos, g_printbuffer[i], [12,12], [1,1,1], 1.0f, 0); + pos_y += 14; + } +} + +/* +================= +CSQC_DrawCenterprint + +Read centerprints from a buffer and display them with alpha and whatnot +================= +*/ +float fCenterPrintAlpha; +float fCenterPrintTime; +float fCenterPrintLines; +string sCenterPrintBuffer[18]; + +void CSQC_DrawCenterprint(void) +{ + if (fCenterPrintAlpha <= 0) { + return; + } + + vector vCenterPrintPos; + + if (fCenterPrintTime > time) { + fCenterPrintAlpha = 1; + } else { + fCenterPrintAlpha -= frametime; + + if (fCenterPrintAlpha < 0) { + fCenterPrintAlpha = 0; + } + } + + vCenterPrintPos_y = video_mins_y + (video_res_y / 2) - (fCenterPrintLines - 4) - 69; + + for (int i = 0; i < (fCenterPrintLines); i++) { + vCenterPrintPos_x = video_mins_x + (video_res_x / 2) - (stringwidth(sCenterPrintBuffer[i], TRUE, '12 12') / 2); + drawstring(vCenterPrintPos, sCenterPrintBuffer[i], '12 12', '1 1 1', fCenterPrintAlpha, 0); + vCenterPrintPos_y += 8; + } +} diff --git a/Source/client/valve.src b/Source/client/valve.src index 5841cccc..a4f02bf7 100755 --- a/Source/client/valve.src +++ b/Source/client/valve.src @@ -20,15 +20,38 @@ valve/init.c ../gs-entbase/client.src -../shared/pmove.c sound.c text.c -hud_voice.c +voice.c + +../shared/valve/animations.c +../shared/valve/player.cpp player.c +../shared/pmove.c predict.c ../shared/effects.c ../shared/spraylogo.cpp +../shared/valve/items.h +../shared/valve/crosshair.h +../shared/valve/weapons.h +../shared/valve/w_crowbar.c +../shared/valve/w_glock.c +../shared/valve/w_python.c +../shared/valve/w_mp5.c +../shared/valve/w_crossbow.c +../shared/valve/w_shotgun.c +../shared/valve/w_rpg.c +../shared/valve/w_gauss.c +../shared/valve/w_egon.c +../shared/valve/w_hornetgun.c +../shared/valve/w_handgrenade.c +../shared/valve/w_tripmine.c +../shared/valve/w_satchel.c +../shared/valve/w_snark.c +../shared/valve/weapons.c + +valve/player.c entities.c valve/cmds.c @@ -37,7 +60,10 @@ events.c valve/view.c view.c damage.c +chat.c valve/hud.c +valve/hud_weaponselect.c +valve/input.c entry.c #endlist diff --git a/Source/client/valve/defs.h b/Source/client/valve/defs.h index 3925b91e..130b7368 100644 --- a/Source/client/valve/defs.h +++ b/Source/client/valve/defs.h @@ -6,6 +6,8 @@ * ****/ +vector g_hud_color; + struct { //Viewmodel stuff @@ -31,29 +33,16 @@ struct vector vCameraAngle; float fCameraTime; -// Flashbang'd - float fFlashTime; - float fFlashAlpha; - //UI fields float fVGUI_Display; // The VGUI menu currently being drawn int iShowScores; // This is seperated from the other VGUI stuff so we can check scores while buying and whatnot - // Testing - int iOverview; - int iMapExpand; - float fMapLerp; - -//crosshair - int iOldShotMultiplier; - float fCrosshairDistance; - float fDecreaseShotTime; - int iShotMultiplier; - //buy menu // We can only carry one item per slot, so this is hacking around the last one - int iHUDGrenades; - int iHUDGrenadesSelected; - float fHUDWeaponSelectTime; float fHUDWeaponSelected; + float fHUDWeaponSelectTime; } seats[4], *pSeat; + +void HUD_DrawAmmo1(void); +void HUD_DrawAmmo2(void); +void HUD_DrawAmmo3(void); diff --git a/Source/client/valve/game_event.c b/Source/client/valve/game_event.c index ddad54a2..0d9b8d7c 100644 --- a/Source/client/valve/game_event.c +++ b/Source/client/valve/game_event.c @@ -8,5 +8,21 @@ void Game_Parse_Event(float fHeader) { - + if (fHeader == EV_CHAT) { + float fSender = readbyte(); + float fTeam = readbyte(); + string sMessage = readstring(); + + CSQC_Parse_Print(sprintf("%s: %s", getplayerkeyvalue(fSender, "name"), sMessage), PRINT_CHAT); + } else if (fHeader == EV_CHAT_TEAM) { + float fSender2 = readbyte(); + float fTeam2 = readbyte(); + string sMessage2 = readstring(); + + CSQC_Parse_Print(sprintf("[TEAM] %s: %s", getplayerkeyvalue(fSender2, "name"), sMessage2), PRINT_CHAT); + } else if (fHeader == EV_CHAT_VOX) { + Sound_PlayVOX(readstring()); + } else if (fHeader == EV_VIEWMODEL) { + View_PlayAnimation(readbyte()); + } } diff --git a/Source/client/valve/hud.c b/Source/client/valve/hud.c index d606e5e7..b64c7c87 100644 --- a/Source/client/valve/hud.c +++ b/Source/client/valve/hud.c @@ -13,8 +13,6 @@ #define NUMSIZE_Y 24/128 #define HUD_ALPHA 0.5 -vector g_hud_color; - float spr_hudnum[10] = { 0 / 256, 24 / 256, @@ -34,15 +32,15 @@ float spr_health[4] = { 32 / 128 // size y }; float spr_suit1[4] = { - 10 / 256, // pos x + 0 / 256, // pos x 24 / 128, // pos u - 30 / 256, // size x + 40 / 256, // size x 40 / 128 // size y }; float spr_suit2[4] = { - 50 / 256, // pos x + 40 / 256, // pos x 24 / 128, // pos u - 30 / 256, // size x + 40 / 256, // size x 40 / 128 // size y }; @@ -60,6 +58,8 @@ float spr_flash2[4] = { 32 / 128 // size y }; +void HUD_DrawWeaponSelect(void); + void HUD_Init(void) { precache_model("sprites/640hud7.spr"); @@ -77,6 +77,12 @@ void HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) { [NUMSIZE_X, NUMSIZE_Y], vColor, fAlpha, DRAWFLAG_ADDITIVE); } +void HUD_DrawSeperator(vector pos) +{ + drawsubpic(pos, [2,24], HUD_NUMS, [240/256, 0], + [2/256, 24/128], g_hud_color, HUD_ALPHA, DRAWFLAG_ADDITIVE); +} + /* ================= HUD_DrawNums @@ -129,6 +135,7 @@ void HUD_DrawHealth(void) { [spr_health[2], spr_health[3]], [1,0,0], HUD_ALPHA, DRAWFLAG_ADDITIVE); HUD_DrawNums(pl.health, pos + [72, 0], HUD_ALPHA, [1,0,0]); } + fOldHealth = pl.health; } @@ -147,7 +154,7 @@ void HUD_DrawArmor(void) static float armoralpha; player pl = (player)self; - pos = video_mins + [128, video_res[1] - 42]; + pos = video_mins + [72+16+30, video_res[1] - 42]; if (pl.armor != oldarmor) { armoralpha = 1.0; @@ -159,13 +166,100 @@ void HUD_DrawArmor(void) armoralpha = HUD_ALPHA; } - drawsubpic(pos + [0,-9], [30,40], HUD_NUMS, [spr_suit2[0], spr_suit2[1]], + drawsubpic(pos + [0,-9], [40,40], HUD_NUMS, [spr_suit2[0], spr_suit2[1]], [spr_suit2[2], spr_suit2[3]], g_hud_color, armoralpha, DRAWFLAG_ADDITIVE); - HUD_DrawNums(pl.armor, pos + [72, 0], armoralpha, g_hud_color); + + float fwhat = pl.armor / 100; + if (fwhat > 0.0) { + drawsubpic(pos + [0,-9], [40,40*fwhat], HUD_NUMS, [spr_suit1[0], spr_suit1[1]], + [spr_suit1[2], spr_suit1[3]*fwhat], g_hud_color, armoralpha, DRAWFLAG_ADDITIVE); + } + + HUD_DrawNums(pl.armor, pos + [80, 0], armoralpha, g_hud_color); oldarmor = pl.armor; } +void HUD_DrawAmmo1(void) +{ + player pl = (player)self; + vector pos; + static int old_ammo1; + static float ammo1_alpha; + + if (pl.a_ammo1 != old_ammo1) { + ammo1_alpha = 1.0; + old_ammo1 = pl.a_ammo1; + } + + if (ammo1_alpha >= HUD_ALPHA) { + ammo1_alpha -= frametime * 0.5; + } else { + ammo1_alpha = HUD_ALPHA; + } + + pos = video_mins + [video_res[0] - 48, video_res[1] - 42]; + + /* Magazine/Clip */ + if (pl.a_ammo1 != -1) { + HUD_DrawNums(pl.a_ammo1, pos + [-80,0], ammo1_alpha, g_hud_color); + } + + HUD_DrawSeperator(pos + [-50,0]); +} + +void HUD_DrawAmmo2(void) +{ + player pl = (player)self; + vector pos; + + static int old_ammo2; + static float ammo2_alpha; + + if (pl.a_ammo2 != old_ammo2) { + ammo2_alpha = 1.0; + old_ammo2 = pl.a_ammo2; + } + + if (ammo2_alpha >= HUD_ALPHA) { + ammo2_alpha -= frametime * 0.5; + } else { + ammo2_alpha = HUD_ALPHA; + } + + pos = video_mins + [video_res[0] - 48, video_res[1] - 42]; + + /* Leftover Ammo */ + HUD_DrawNums(pl.a_ammo2, pos, ammo2_alpha, g_hud_color); +} + +void HUD_DrawAmmo3(void) +{ + player pl = (player)self; + vector pos; + + static int old_ammo3; + static float ammo3_alpha; + + if (pl.a_ammo3 != old_ammo3) { + ammo3_alpha = 1.0; + old_ammo3 = pl.a_ammo3; + } + + if (ammo3_alpha >= HUD_ALPHA) { + ammo3_alpha -= frametime * 0.5; + } else { + ammo3_alpha = HUD_ALPHA; + } + + pos = video_mins + [video_res[0] - 48, video_res[1] - 42]; + + /* Special */ + if (pl.a_ammo3) { + HUD_DrawNums(pl.a_ammo3, pos + [0, -32], ammo3_alpha, g_hud_color); + } +} + void HUD_DrawFlashlight(void) { vector pos; @@ -183,4 +277,11 @@ void HUD_Draw(void) HUD_DrawArmor(); HUD_DrawFlashlight(); Damage_Draw(); + Weapons_DrawCrosshair(); + HUD_DrawWeaponSelect(); +} + +void VGUI_DrawSpectatorHUD(void) +{ + // FIXME } diff --git a/Source/client/valve/hud_weaponselect.c b/Source/client/valve/hud_weaponselect.c new file mode 100644 index 00000000..0a69a9b0 --- /dev/null +++ b/Source/client/valve/hud_weaponselect.c @@ -0,0 +1,152 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +vector vHUDSlotNumPos[6] = { + [168 / 255,72 / 128], + [188 / 255,72 / 128], + [208 / 255,72 / 128], + [168 / 255,92 / 128], + [188 / 255,92 / 128], + [208 / 255,92 / 128] +}; + +void HUD_DrawWeaponSelect_Forward(void) +{ + player pl = (player)self; + + if (!pl.activeweapon) { + return; + } + + if (pSeat->fHUDWeaponSelectTime < time) { + pSeat->fHUDWeaponSelected = pl.activeweapon; + sound(self, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE); + } else { + sound(self, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE); + pSeat->fHUDWeaponSelected--; + if (pSeat->fHUDWeaponSelected <= 0) { + pSeat->fHUDWeaponSelected = g_weapons.length - 1; + } + } + + pSeat->fHUDWeaponSelectTime = time + 3; + + if (!(pl.items & g_weapons[pSeat->fHUDWeaponSelected].id)) { + HUD_DrawWeaponSelect_Forward(); + } +} + +void HUD_DrawWeaponSelect_Back(void) +{ + player pl = (player)self; + + if (!pl.activeweapon) { + return; + } + + if (pSeat->fHUDWeaponSelectTime < time) { + pSeat->fHUDWeaponSelected = pl.activeweapon; + sound(self, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE); + } else { + sound(self, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE); + pSeat->fHUDWeaponSelected++; + if (pSeat->fHUDWeaponSelected >= g_weapons.length) { + pSeat->fHUDWeaponSelected = 1; + } + } + + pSeat->fHUDWeaponSelectTime = time + 3; + + if (!(pl.items & g_weapons[pSeat->fHUDWeaponSelected].id)) { + HUD_DrawWeaponSelect_Back(); + } +} + +void HUD_DrawWeaponSelect_Trigger(void) +{ + sendevent("PlayerSwitchWeapon", "f", pSeat->fHUDWeaponSelected); + sound(self, CHAN_ITEM, "common/wpn_select.wav", 0.5f, ATTN_NONE); + pSeat->fHUDWeaponSelected = pSeat->fHUDWeaponSelectTime = 0; +} + +void HUD_DrawWeaponSelect_Last(void) +{ + +} + +void HUD_DrawWeaponSelect_Num(vector vPos, float fValue) +{ + drawsubpic(vPos, [20,20], "sprites/640hud7.spr_0.tga", vHUDSlotNumPos[fValue], [20/255, 20/128], g_hud_color, 1, DRAWFLAG_ADDITIVE); +} + +int Weapon_InSlotPos(int slot, int pos) +{ + player pl = (player)self; + for (int i = 1; i < g_weapons.length; i++) { + if (g_weapons[i].slot == slot && g_weapons[i].slot_pos == pos) { + if (pl.items & g_weapons[i].id) { + return i; + } else { + return -1; + } + } + } + return -1; +} +void HUD_DrawWeaponSelect(void) +{ + player pl = (player)self; + if (!pl.activeweapon) { + return; + } + if (pSeat->fHUDWeaponSelectTime < time) { + if (pSeat->fHUDWeaponSelected) { + sound(self, CHAN_ITEM, "common/wpn_hudoff.wav", 0.5, ATTN_NONE); + pSeat->fHUDWeaponSelected = 0; + } + return; + } + + vector vSelectPos = video_mins + [16,16]; + + int wantslot = g_weapons[pSeat->fHUDWeaponSelected].slot; + int wantpos = g_weapons[pSeat->fHUDWeaponSelected].slot_pos; + int b; + for (int i = 0; i < 5; i++) { + int slot_selected = 0; + vSelectPos[1] = video_mins[1] + 16; + HUD_DrawWeaponSelect_Num(vSelectPos, i); + vSelectPos[1] += 20; + for (int x = 0; x < 32; x++) { + if (i == wantslot) { + slot_selected = TRUE; + if (x == wantpos) { + // Selected Sprite + Weapons_HUDPic(pSeat->fHUDWeaponSelected, 1, vSelectPos); + drawsubpic(vSelectPos, [170,45], "sprites/640hud3.spr_0.tga", + [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + vSelectPos[1] += 50; + } else if ((b=Weapon_InSlotPos(i, x)) != -1) { + // Unselected Sprite + Weapons_HUDPic(b, 0, vSelectPos); + vSelectPos[1] += 50; + } + } else if (Weapon_InSlotPos(i, x) != -1) { + HUD_DrawWeaponSelect_Num(vSelectPos, 5); + vSelectPos[1] += 25; + } + } + + if (slot_selected == TRUE) { + vSelectPos[0] += 175; + } else { + vSelectPos[0] += 25; + } + } +} + diff --git a/Source/client/valve/init.c b/Source/client/valve/init.c index 2b19f947..f5aff132 100644 --- a/Source/client/valve/init.c +++ b/Source/client/valve/init.c @@ -15,5 +15,10 @@ Comparable to worldspawn in SSQC in that it's mostly used for precaches */ void Client_Init(float apilevel, string enginename, float engineversion) { - + precache_model("sprites/640hud1.spr"); + precache_model("sprites/640hud2.spr"); + precache_model("sprites/640hud3.spr"); + precache_model("sprites/640hud4.spr"); + precache_model("sprites/640hud5.spr"); + precache_model("sprites/640hud6.spr"); } diff --git a/Source/client/valve/input.c b/Source/client/valve/input.c new file mode 100644 index 00000000..c7492019 --- /dev/null +++ b/Source/client/valve/input.c @@ -0,0 +1,20 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +void Game_Input(void) +{ + if (input_buttons & INPUT_BUTTON0) { + Weapons_Primary(); + } else if (input_buttons & INPUT_BUTTON4) { + Weapons_Reload(); + } else if (input_buttons & INPUT_BUTTON3) { + Weapons_Secondary(); + } else { + Weapons_Release(); + } +} diff --git a/Source/client/valve/player.c b/Source/client/valve/player.c new file mode 100644 index 00000000..75cf86f7 --- /dev/null +++ b/Source/client/valve/player.c @@ -0,0 +1,47 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +void Player_ReadEntity(float flIsNew) +{ + player pl = (player)self; + + if ( flIsNew == TRUE ) { + spawnfunc_player(); + + pl.classname = "player"; + pl.solid = SOLID_SLIDEBOX; + pl.drawmask = MASK_ENGINE; + pl.customphysics = Empty; + setsize( pl, VEC_HULL_MIN, VEC_HULL_MAX ); + } + + pl.modelindex = readshort(); + pl.origin[0] = readcoord(); + pl.origin[1] = readcoord(); + pl.origin[2] = readcoord(); + pl.pitch = readcoord() / 90; + pl.angles[1] = readcoord(); + pl.angles[2] = readcoord(); + pl.velocity[0] = readcoord(); + pl.velocity[1] = readcoord(); + pl.velocity[2] = readcoord(); + pl.flags = readfloat(); + pl.activeweapon = readbyte(); + pl.items = readfloat(); + pl.health = readbyte(); + pl.armor = readbyte(); + pl.movetype = readfloat(); + pl.view_ofs[2] = readfloat(); + pl.viewzoom = readfloat(); + pl.a_ammo1 = readbyte(); + pl.a_ammo2 = readbyte(); + pl.a_ammo3 = readbyte(); + pl.w_attack_next = readfloat(); + pl.w_idle_next = readfloat(); + setorigin( pl, pl.origin ); +} diff --git a/Source/client/valve/view.c b/Source/client/valve/view.c index 54b93f14..ac034be0 100644 --- a/Source/client/valve/view.c +++ b/Source/client/valve/view.c @@ -8,29 +8,18 @@ void View_UpdateWeapon(entity vm, entity mflash) { - /*if( aw < CS_WEAPON_COUNT ) { - if ( pSeat->fLastWeapon != aw ) { - pSeat->fLastWeapon = aw; - if ( aw >= 1 ) { - string wm; - if (autocvar_skins_dir != "") { - wm = sprintf("skins/%s/%s", autocvar_skins_dir, sViewModels[ aw - 1 ]); - } else { - wm = sprintf("models/%s", sViewModels[ aw - 1 ]); - } - setmodel( eViewModel, wm ); + player pl = (player)self; + + if (pSeat->fLastWeapon != pl.activeweapon) { + pSeat->fLastWeapon = pl.activeweapon; + if (pl.activeweapon) { + setmodel(vm, g_weapons[pl.activeweapon].vmodel()); - if (getstati_punf(STAT_TEAM) == TEAM_CT) { - setcustomskin(eViewModel, "", "geomset 0 2\n"); - } else { - setcustomskin(eViewModel, "", "geomset 0 1\n"); - } - - skel_delete( eMuzzleflash.skeletonindex ); - eMuzzleflash.skeletonindex = skel_create( eViewModel.modelindex ); - pSeat->fNumBones = skel_get_numbones( eMuzzleflash.skeletonindex ) + 1; - pSeat->fEjectBone = pSeat->fNumBones + 1; - } - } - }*/ + skel_delete( mflash.skeletonindex ); + mflash.skeletonindex = skel_create( vm.modelindex ); + pSeat->fNumBones = skel_get_numbones( mflash.skeletonindex ) + 1; + pSeat->fEjectBone = pSeat->fNumBones + 1; + } + Weapons_Draw(); + } } diff --git a/Source/client/view.c b/Source/client/view.c index 66350bad..8991f496 100755 --- a/Source/client/view.c +++ b/Source/client/view.c @@ -15,6 +15,19 @@ void View_Init(void) precache_model(wm); } #endif + + for (int s = seats.length; s-- > numclientseats;) { + pSeat = &seats[s]; + if( !pSeat->eViewModel ) { + pSeat->eViewModel = spawn(); + pSeat->eViewModel.classname = "vm"; + pSeat->eViewModel.renderflags = RF_DEPTHHACK; + + pSeat->eMuzzleflash = spawn(); + pSeat->eMuzzleflash.classname = "mflash"; + pSeat->eMuzzleflash.renderflags = RF_ADDITIVE; + } + } } void View_CalcViewport(int s, float fWinWidth, float fWinHeight) { @@ -97,7 +110,7 @@ Gives the angle a bit of an offset/punch/kick */ void View_AddPunchAngle( vector add ) { - pSeat->vPunchAngle += add; + pSeat->vPunchAngle /*+*/= add; } /* @@ -110,19 +123,12 @@ muzzleflash, dynamic lights and so on appear */ void View_DrawViewModel( void ) { - if( !pSeat->eViewModel ) { - pSeat->eViewModel = spawn(); - pSeat->eViewModel.classname = "vm"; - pSeat->eViewModel.renderflags = RF_VIEWMODEL | RF_DEPTHHACK; - - pSeat->eMuzzleflash = spawn(); - pSeat->eMuzzleflash.classname = "mflash"; - pSeat->eMuzzleflash.renderflags = RF_VIEWMODEL | RF_ADDITIVE; - } entity eViewModel = pSeat->eViewModel; entity eMuzzleflash = pSeat->eMuzzleflash; + + player pl = (player) self; - if ( getstatf( STAT_HEALTH ) <= 0 ) { + if ( pl.health <= 0 ) { return; } @@ -136,8 +142,10 @@ void View_DrawViewModel( void ) processmodelevents( eViewModel.modelindex, eViewModel.frame, fBaseTime, eViewModel.frame1time, Event_ProcessModel ); } - makevectors( '0 0 0'); - eViewModel.origin = '0 0 -1' + ( v_forward * ( pSeat->fBob * 0.4 ) ) + makevectors(view_angles); + eViewModel.angles = view_angles; + eViewModel.origin = pSeat->vPlayerOrigin + pl.view_ofs; + eViewModel.origin += '0 0 -1' + ( v_forward * ( pSeat->fBob * 0.4 ) ) + ( v_forward * autocvar_v_gunofs[0] ) + ( v_right * autocvar_v_gunofs[1] ) + ( v_up * autocvar_v_gunofs[2] ); @@ -160,7 +168,7 @@ void View_DrawViewModel( void ) } // Only bother when zoomed out - if ( getstatf( STAT_VIEWZOOM ) == 1.0f ) { + if ( pl.viewzoom == 1.0f ) { // Update muzzleflash position and draw it if ( eMuzzleflash.alpha > 0.0f ) { makevectors(getproperty(VF_ANGLES)); diff --git a/Source/client/hud_voice.c b/Source/client/voice.c similarity index 100% rename from Source/client/hud_voice.c rename to Source/client/voice.c diff --git a/Source/defs.h b/Source/defs.h index 3f181483..7d76298a 100644 --- a/Source/defs.h +++ b/Source/defs.h @@ -12,8 +12,15 @@ const vector VEC_HULL_MAX = '16 16 36'; const vector VEC_CHULL_MIN = '-16 -16 -18'; const vector VEC_CHULL_MAX = '16 16 18'; +#ifdef CSTRIKE const vector VEC_PLAYER_VIEWPOS = '0 0 20'; const vector VEC_PLAYER_CVIEWPOS = '0 0 12'; +#endif + +#ifdef VALVE +const vector VEC_PLAYER_VIEWPOS = '0 0 24'; +const vector VEC_PLAYER_CVIEWPOS = '0 0 12'; +#endif // Actually used by input_button etc. #define INPUT_BUTTON0 1 diff --git a/Source/events.h b/Source/events.h index e1d08efb..101c59f6 100644 --- a/Source/events.h +++ b/Source/events.h @@ -19,6 +19,9 @@ enum { EV_CHAT, EV_CHAT_TEAM, EV_CHAT_VOX, +#ifdef VALVE + EV_VIEWMODEL, +#endif #ifdef CSTRIKE EV_RADIOMSG, EV_RADIOMSG2, diff --git a/Source/gs-entbase/server.src b/Source/gs-entbase/server.src index aaa17f26..c4fcdb49 100644 --- a/Source/gs-entbase/server.src +++ b/Source/gs-entbase/server.src @@ -48,6 +48,7 @@ ../gs-entbase/server/item_food.cpp ../gs-entbase/server/item_suit.cpp ../gs-entbase/server/path_corner.cpp +../gs-entbase/server/path_track.cpp ../gs-entbase/server/multi_manager.cpp ../gs-entbase/server/monster_furniture.cpp ../gs-entbase/server/monster_generic.cpp diff --git a/Source/gs-entbase/server/baseentity.cpp b/Source/gs-entbase/server/baseentity.cpp index c7668272..92f97c02 100644 --- a/Source/gs-entbase/server/baseentity.cpp +++ b/Source/gs-entbase/server/baseentity.cpp @@ -89,9 +89,9 @@ void CBaseEntity::RendermodeUpdate(void) alpha = bound(0.001, ( m_renderamt / 255 ), 1.0); if ( m_rendermode == RM_ADDITIVE ) { - effects = EF_ADDITIVE; // QWSSQC: EF_FLAG2 + effects = EF_FLAG2; // SSQC: EF_ADDITIVE } else if ( m_rendermode == RM_GLOW ) { - effects = EF_ADDITIVE | EF_FULLBRIGHT; + effects = EF_FLAG2 | EF_FULLBRIGHT; } } diff --git a/Source/gs-entbase/server/basetrigger.cpp b/Source/gs-entbase/server/basetrigger.cpp index 5c8cbfec..c246333e 100644 --- a/Source/gs-entbase/server/basetrigger.cpp +++ b/Source/gs-entbase/server/basetrigger.cpp @@ -89,7 +89,7 @@ void CBaseTrigger :: InitBrushTrigger ( void ) setmodel( this, model ); #ifdef GS_DEVELOPER alpha = 0.5f; - effects = EF_ADDITIVE; + effects = EF_FLAG2; #else modelindex = 0; model = ""; diff --git a/Source/gs-entbase/server/defs.h b/Source/gs-entbase/server/defs.h index 9b2bc0b3..003f5805 100644 --- a/Source/gs-entbase/server/defs.h +++ b/Source/gs-entbase/server/defs.h @@ -6,7 +6,7 @@ * ****/ -//#define GS_DEVELOPER +#define GS_DEVELOPER .float gflags; diff --git a/Source/gs-entbase/server/func_door_rotating.cpp b/Source/gs-entbase/server/func_door_rotating.cpp index b5c80bef..b1387e71 100644 --- a/Source/gs-entbase/server/func_door_rotating.cpp +++ b/Source/gs-entbase/server/func_door_rotating.cpp @@ -209,10 +209,8 @@ void func_door_rotating::Touch(void) } if (other.movetype == MOVETYPE_WALK) { - if (other.absmin[2] <= maxs[2] - 2) { - eActivator = other; - Trigger(); - } + eActivator = other; + Trigger(); } touch = __NULL__; } diff --git a/Source/gs-entbase/server/func_ladder.cpp b/Source/gs-entbase/server/func_ladder.cpp index 6dcdcc0b..691841c0 100644 --- a/Source/gs-entbase/server/func_ladder.cpp +++ b/Source/gs-entbase/server/func_ladder.cpp @@ -64,9 +64,9 @@ void func_ladder :: func_ladder ( void ) #ifdef GS_DEVELOPER alpha = 0.5f; - effects = EF_ADDITIVE; + effects = EF_FLAG2; #else alpha = 0.0001f; - effects = EF_NODRAW; + //effects = EF_NODRAW; #endif } diff --git a/Source/gs-entbase/server/func_wall.cpp b/Source/gs-entbase/server/func_wall.cpp index 04c057bc..fa6332ed 100644 --- a/Source/gs-entbase/server/func_wall.cpp +++ b/Source/gs-entbase/server/func_wall.cpp @@ -27,3 +27,5 @@ void func_wall :: Trigger ( void ) frame = 1 - frame; } +CLASSEXPORT(func_tracktrain, func_wall) + diff --git a/Source/gs-entbase/server/infodecal.cpp b/Source/gs-entbase/server/infodecal.cpp index 3b412681..067e4340 100644 --- a/Source/gs-entbase/server/infodecal.cpp +++ b/Source/gs-entbase/server/infodecal.cpp @@ -46,7 +46,6 @@ void infodecal(void) self.texture = sprintf( "materials/%s", self.texture ); } - self.texture = ""; if (!self.texture) { remove(self); return; diff --git a/Source/gs-entbase/server/path_track.cpp b/Source/gs-entbase/server/path_track.cpp new file mode 100644 index 00000000..c558a207 --- /dev/null +++ b/Source/gs-entbase/server/path_track.cpp @@ -0,0 +1,22 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +class path_track:CBaseTrigger +{ + float m_flSpeed; + float m_flWait; + + void() path_track; +}; + +void path_track::path_track(void) +{ + CBaseTrigger::CBaseTrigger(); + m_flSpeed = 100; + m_flWait = 1.0f; +} diff --git a/Source/gs-entbase/server/trigger_push.cpp b/Source/gs-entbase/server/trigger_push.cpp index 666bd780..26f13aa5 100644 --- a/Source/gs-entbase/server/trigger_push.cpp +++ b/Source/gs-entbase/server/trigger_push.cpp @@ -60,9 +60,10 @@ void trigger_push :: touch ( void ) if ( other.solid != SOLID_NOT && other.solid != SOLID_BSP ) { if ( spawnflags & TP_ONCE ) { other.velocity = other.velocity + (m_flSpeed * m_vecMoveDir); - if ( other.velocity[2] > 0 ) + if ( other.velocity[2] > 0 ) { other.flags &= ~FL_ONGROUND; - remove( self ); + } + Hide(); } else { /*vector vecPush = m_flSpeed * m_vecMoveDir; if ( other.flags & FL_BASEVELOCITY ) { diff --git a/Source/math.h b/Source/math.h index 58b7032a..c0dcf7ac 100755 --- a/Source/math.h +++ b/Source/math.h @@ -8,6 +8,15 @@ #define MATH_PI 3.1415926 +float Math_Time(void) +{ +#ifdef CSQC + return 0; +#else + return 0; +#endif +} + float Math_LerpAngle( float fStart, float fEnd, float fAmount ) { float shortest_angle = ( ( ( ( fEnd - fStart ) % 360 ) + 540 ) % 360 ) - 180; return shortest_angle * fAmount; @@ -53,10 +62,6 @@ float Math_CRandom( void ) { } #if defined(SSQC) || defined(CSQC) -#ifdef SSQC -void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos, int iSkipArmor ); -#endif - //.vector basevelocity; int QPhysics_IsStuck( entity eTarget, vector vOffset, vector vecMins, vector vecMaxs ) { diff --git a/Source/menu-fn/entry.cpp b/Source/menu-fn/entry.cpp index 3b07c2bd..dc09c2a2 100644 --- a/Source/menu-fn/entry.cpp +++ b/Source/menu-fn/entry.cpp @@ -25,6 +25,8 @@ void m_init(void) localcmd("con_textsize -12\n"); localcmd("scr_conalpha 1\n"); localcmd("cl_idlefps 0\n"); + localcmd("gl_mindist 4\n"); // Thanks Valve for v_shotgun.mdl + localcmd("_pext_infoblobs 1\n"); /* Hack! */ localcmd("gl_font 0\n"); diff --git a/Source/menu-fn/m_customgame.cpp b/Source/menu-fn/m_customgame.cpp index 4cf8b352..f717d4ea 100644 --- a/Source/menu-fn/m_customgame.cpp +++ b/Source/menu-fn/m_customgame.cpp @@ -163,6 +163,7 @@ void games_init(void) CWidget fn_customgame; CFrame customgame_frMods; CModList customgame_lbMods; +CScrollbar customgame_sbMods; CMainButton customgame_btnActivate; CMainButton customgame_btnInstall; @@ -177,7 +178,7 @@ void customgame_btnactivate_start(void) gameinfo_current = nextgame; localcmd(sprintf("gamedir \"%s\"\n", games[nextgame].gamedir)); - localcmd("snd_restart\nwait\nmenu_restart\nmenu_customgame\n"); + localcmd("snd_restart\nwait\nvid_reload\nmenu_restart\nmenu_customgame\n"); // TODO: Re-init important menu bits and bobs. //m_shutdown(); @@ -186,7 +187,7 @@ void customgame_btnactivate_start(void) void customgame_btndeactivate_start(void) { localcmd("gamedir \"\"\n"); - localcmd("snd_restart\nwait\nmenu_restart\nmenu_customgame\n"); + localcmd("snd_restart\nwait\nvid_reload\nmenu_restart\nmenu_customgame\n"); } void customgame_btndone_start(void) @@ -202,6 +203,10 @@ void customgame_btndone_start(void) header.SetHeader(HEAD_CUSTOM); header.SetExecute(customgame_btndone_end); } +void customgame_sbmods_changed(int val) +{ + customgame_lbMods.SetScroll(val); +} void menu_customgame_init(void) { @@ -249,8 +254,15 @@ void menu_customgame_init(void) customgame_lbMods.SetPos(144,159); customgame_lbMods.SetSize(457,283); Widget_Add(fn_customgame, customgame_lbMods); + + customgame_sbMods = spawn(CScrollbar); + customgame_sbMods.SetPos(141+463,156); + customgame_sbMods.SetItemheight(29); + customgame_sbMods.SetHeight(289); + customgame_sbMods.SetCallback(customgame_sbmods_changed); + customgame_sbMods.SetMax(gameinfo_count); + Widget_Add(fn_customgame, customgame_sbMods); - //customgame_lbMods.SetMax(gameinfo_count); } void menu_customgame_draw(void) @@ -258,21 +270,21 @@ void menu_customgame_draw(void) drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_CUSTOM],[460,80], [1,1,1], 1.0f, 1); Widget_Draw(fn_customgame); - WLabel_Static(g_menuofs[0] + 155, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_TYPE], 11, 11, [1,1,1], + WLabel_Static(155, 143, m_reslbl[IDS_MODLIST_TYPE], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 201, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_NAME], 11, 11, [1,1,1], + WLabel_Static(201, 143, m_reslbl[IDS_MODLIST_NAME], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 321, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_VERSION], 11, 11, [1,1,1], + WLabel_Static(321, 143, m_reslbl[IDS_MODLIST_VERSION], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 371, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_SIZE], 11, 11, [1,1,1], + WLabel_Static(371, 143, m_reslbl[IDS_MODLIST_SIZE], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 421, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_RATING], 11, 11, [1,1,1], + WLabel_Static(421, 143, m_reslbl[IDS_MODLIST_RATING], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 471, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_INSTALLED], 11, 11, [1,1,1], + WLabel_Static(471, 143, m_reslbl[IDS_MODLIST_INSTALLED], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 521, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_SERVERS], 11, 11, [1,1,1], + WLabel_Static(521, 143, m_reslbl[IDS_MODLIST_SERVERS], 11, 11, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 571, g_menuofs[1] + 143, m_reslbl[IDS_MODLIST_PLAYERS], 11, 11, [1,1,1], + WLabel_Static(571, 143, m_reslbl[IDS_MODLIST_PLAYERS], 11, 11, [1,1,1], 1.0f, 0, font_arial); } diff --git a/Source/menu-fn/m_internetgames.cpp b/Source/menu-fn/m_internetgames.cpp index 6177f7f0..3579194d 100644 --- a/Source/menu-fn/m_internetgames.cpp +++ b/Source/menu-fn/m_internetgames.cpp @@ -165,15 +165,15 @@ void menu_internetgames_draw(void) drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_INETGAMES],[460,80], [1,1,1], 1.0f, 1); /* Labels */ - WLabel_Static(g_menuofs[0] + 252, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_GAMESERVER], 10, 10, [1,1,1], + WLabel_Static(252, 128, m_reslbl[IDS_SERVER_GAMESERVER], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 357, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_SPEED], 10, 10, [1,1,1], + WLabel_Static(357, 128, m_reslbl[IDS_SERVER_SPEED], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 407, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_MAP], 10, 10, [1,1,1], + WLabel_Static(407, 128, m_reslbl[IDS_SERVER_MAP], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 476, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_GAME], 10, 10, [1,1,1], + WLabel_Static(476, 128, m_reslbl[IDS_SERVER_GAME], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 552, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_PLAYERS], 10, 10, [1,1,1], + WLabel_Static(552, 128, m_reslbl[IDS_SERVER_PLAYERS], 10, 10, [1,1,1], 1.0f, 0, font_arial); } diff --git a/Source/menu-fn/m_langames.cpp b/Source/menu-fn/m_langames.cpp index 0f728782..23c25181 100644 --- a/Source/menu-fn/m_langames.cpp +++ b/Source/menu-fn/m_langames.cpp @@ -135,15 +135,15 @@ void menu_langames_draw(void) drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_LAN],[460,80], [1,1,1], 1.0f, 1); /* Labels */ - WLabel_Static(g_menuofs[0] + 282, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_GAMESERVER], 10, 10, [1,1,1], + WLabel_Static(282, 128, m_reslbl[IDS_SERVER_GAMESERVER], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 377, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_SPEED], 10, 10, [1,1,1], + WLabel_Static(377, 128, m_reslbl[IDS_SERVER_SPEED], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 422, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_MAP], 10, 10, [1,1,1], + WLabel_Static(422, 128, m_reslbl[IDS_SERVER_MAP], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 497, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_GAME], 10, 10, [1,1,1], + WLabel_Static(497, 128, m_reslbl[IDS_SERVER_GAME], 10, 10, [1,1,1], 1.0f, 0, font_arial); - WLabel_Static(g_menuofs[0] + 572, g_menuofs[1] + 128, m_reslbl[IDS_SERVER_PLAYERS], 10, 10, [1,1,1], + WLabel_Static(572, 128, m_reslbl[IDS_SERVER_PLAYERS], 10, 10, [1,1,1], 1.0f, 0, font_arial); } diff --git a/Source/menu-fn/w_modlist.cpp b/Source/menu-fn/w_modlist.cpp index ac7c20d0..9c18d5c1 100644 --- a/Source/menu-fn/w_modlist.cpp +++ b/Source/menu-fn/w_modlist.cpp @@ -55,14 +55,15 @@ void CModList::Draw(void) } if (m_selected == i) { colo = ML_COL_2; - drawfill([g_menuofs[0] + m_x, pos], [m_size[0], 29], + drawfill([g_menuofs[0] + m_x, g_menuofs[1] + pos + ], [m_size[0], 29], [84/255,45/255,0], 1.0f); } else { colo = ML_COL_1; } if (games[i].type != "") { - WLabel_Static(m_x + 2, pos + 3, sprintf("%.8s...",games[i].type), + WLabel_Static(m_x + 2, m_y + 3, sprintf("%.8s...",games[i].type), 11, 11, colo, 1.0f, 0, font_arial); } diff --git a/Source/menu-fn/w_scrollbar.cpp b/Source/menu-fn/w_scrollbar.cpp index 77995b94..b0ce060b 100644 --- a/Source/menu-fn/w_scrollbar.cpp +++ b/Source/menu-fn/w_scrollbar.cpp @@ -16,6 +16,7 @@ class CScrollbar:CWidget int m_scroll; int m_minus; int m_max; + float m_itemheight; virtual void(int value) m_changed = 0; int m_up_hover; @@ -30,6 +31,7 @@ class CScrollbar:CWidget virtual void(int val) SetScroll; virtual void(int val) SetMax; virtual void(int val) SetHeight; + virtual void(int val) SetItemheight; virtual void(void(int val) vFunc) SetCallback; }; @@ -37,6 +39,7 @@ void CScrollbar::CScrollbar(void) { /* There's the physical length (t_length) and the actual length * (border, etc. ignored) */ + SetItemheight(15); SetHeight(128); } @@ -67,8 +70,8 @@ void CScrollbar::Draw(void) [16,16], [1,1,1], 1.0f, 0); } - barheight = m_theight * (m_theight / (m_max * 15)); - barstep = (m_scroll * 15) * (m_theight / (m_max * 15)); + barheight = m_theight * (m_theight / (m_max * m_itemheight)); + barstep = (m_scroll * m_itemheight) * (m_theight / (m_max * m_itemheight)); if (!m_hold) { drawfill([g_menuofs[0]+m_x,g_menuofs[1]+m_y+16], [16,m_theight], [0.25,0.25,0.25], 1.0f); @@ -118,8 +121,8 @@ void CScrollbar::Input(float type, float x, float y, float devid) SetScroll(m_scroll + 1); } - barheight = m_theight * (m_theight / (m_max * 15)); - barstep = (m_scroll * 15) * (m_theight / (m_max * 15)); + barheight = m_theight * (m_theight / (m_max * m_itemheight)); + barstep = (m_scroll * m_itemheight) * (m_theight / (m_max * m_itemheight)); if (Util_CheckMouse(m_x, m_y + 16 + barstep, 16, barheight)) { m_hover = TRUE; @@ -164,7 +167,7 @@ void CScrollbar::SetScroll(int val) void CScrollbar::SetMax(int val) { - m_minus = (m_height - 6) / 15; + m_minus = (m_height - 6) / m_itemheight; m_max = val - m_minus; } @@ -174,6 +177,11 @@ void CScrollbar::SetHeight(int val) m_theight = m_height - 32; } +void CScrollbar::SetItemheight(int val) +{ + m_itemheight = val; +} + void CScrollbar::SetCallback(void(int val) vFunc) { m_changed = vFunc; diff --git a/Source/server/client.c b/Source/server/client.c index 0b74b314..15156d29 100644 --- a/Source/server/client.c +++ b/Source/server/client.c @@ -6,17 +6,17 @@ * ****/ -void Client_TriggerCamera( entity eTarget, vector vPos, vector vEndPos, float fResetTime ) +void Client_TriggerCamera(entity target, vector pos, vector end, float wait) { - WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET ); - WriteByte( MSG_MULTICAST, EV_CAMERATRIGGER ); - WriteCoord( MSG_MULTICAST, vPos_x ); - WriteCoord( MSG_MULTICAST, vPos_y ); - WriteCoord( MSG_MULTICAST, vPos_z ); - WriteCoord( MSG_MULTICAST, vEndPos_x ); - WriteCoord( MSG_MULTICAST, vEndPos_y ); - WriteCoord( MSG_MULTICAST, vEndPos_z ); - WriteFloat( MSG_MULTICAST, fResetTime ); - msg_entity = eTarget; - multicast( '0 0 0', MULTICAST_ONE ); + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, EV_CAMERATRIGGER); + WriteCoord(MSG_MULTICAST, pos[0]); + WriteCoord(MSG_MULTICAST, pos[1]); + WriteCoord(MSG_MULTICAST, pos[2]); + WriteCoord(MSG_MULTICAST, end[0]); + WriteCoord(MSG_MULTICAST, end[1]); + WriteCoord(MSG_MULTICAST, end[2]); + WriteFloat(MSG_MULTICAST, wait); + msg_entity = target; + multicast([0,0,0], MULTICAST_ONE); } diff --git a/Source/server/cstrike.src b/Source/server/cstrike.src index 06a25045..9c85389e 100755 --- a/Source/server/cstrike.src +++ b/Source/server/cstrike.src @@ -1,19 +1,19 @@ #pragma target fte #pragma progs_dat "../../cstrike/progs.dat" -#define SSQC +#define QWSSQC #define CSTRIKE #includelist ../builtins.h ../defs.h +cstrike/defs.h ../shared/cstrike/defs.h ../math.h ../materials.h ../events.h ../entities.h defs.h -cstrike/defs.h cstrike/defsfields.h ../gs-entbase/server.src @@ -65,8 +65,8 @@ cstrike/info_map_parameters.cpp vox.c cstrike/ammo.c -damage.c -cstrike/traceattack.c +cstrike/damage.c +traceattack.c cstrike/rules.c cstrike/timer.c diff --git a/Source/server/cstrike/client.c b/Source/server/cstrike/client.c index 9370077e..9e94d93c 100755 --- a/Source/server/cstrike/client.c +++ b/Source/server/cstrike/client.c @@ -190,8 +190,6 @@ void Game_RunClientCommand( void ) { self.fInVIPZone = FALSE; QPhysics_Run( self ); - - Input_Handle(); } void Game_SetNewParms(void) diff --git a/Source/server/damage.c b/Source/server/cstrike/damage.c similarity index 98% rename from Source/server/damage.c rename to Source/server/cstrike/damage.c index 83bc0a1f..d53d8855 100755 --- a/Source/server/damage.c +++ b/Source/server/cstrike/damage.c @@ -23,7 +23,7 @@ void Damage_CastOrbituary( entity eAttacker, entity eTarget, float fWeapon, floa WriteByte( MSG_BROADCAST, fWeapon ); WriteByte( MSG_BROADCAST, fHeadShot ); msg_entity = self; - multicast( '0 0 0', MULTICAST_ALL ); + multicast( [0,0,0], MULTICAST_ALL ); } /* @@ -86,7 +86,7 @@ Damage_Apply Generic function that applies damage, pain and suffering ================= */ -void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos, int iSkipArmor ) { +void Damage_Apply( entity eTarget, entity eAttacker, float iDamage, vector vHitPos, int iSkipArmor ) { #ifdef CSTRIKE // Modify the damage based on the location if ( trace_surface_id == BODY_HEAD ) { diff --git a/Source/server/cstrike/defs.h b/Source/server/cstrike/defs.h index 2bb13769..0a1f9e0f 100755 --- a/Source/server/cstrike/defs.h +++ b/Source/server/cstrike/defs.h @@ -106,8 +106,6 @@ void Effect_CreateFlash(entity targ); void BaseMelee_Draw( void ); int BaseMelee_Attack( void ); -void TraceAttack_FireBullets( int iShots, vector vPos ); - void Ammo_AutoFill(float fWeapon); void Ammo_BuyPrimary(void); void Ammo_BuySecondary(void); @@ -117,4 +115,6 @@ void Input_Handle( void ); void Animation_PlayerTop( float fFrame ); void Animation_PlayerTopTemp( float fFrame, float fTime ); +void Damage_Apply( entity eTarget, entity eAttacker, float iDamage, vector vHitPos, int iSkipArmor ); + #define NULL __NULL__ diff --git a/Source/server/cstrike/input.c b/Source/server/cstrike/input.c index e7ed61ff..4e514196 100755 --- a/Source/server/cstrike/input.c +++ b/Source/server/cstrike/input.c @@ -35,8 +35,8 @@ void Input_Handle( void ) { Weapon_Switch( SLOT_PRIMARY ); } else if ( self.impulse == 4 ) { Weapon_Switch( SLOT_GRENADE ); - } - + } + if ( self.button5 ) { Player_UseDown(); } else { diff --git a/Source/server/defs.h b/Source/server/defs.h index 9fc778f9..d6b2e346 100644 --- a/Source/server/defs.h +++ b/Source/server/defs.h @@ -13,8 +13,10 @@ void Effect_Impact( int iType, vector vPos, vector vNormal ); void Effect_CreateExplosion( vector vPos ); void Footsteps_Update( void ); + +void TraceAttack_FireBullets( int iShots, vector vPos ); void Damage_Radius( vector vOrigin, entity eAttacker, float fDamage, float fRadius, int iCheckClip ); -void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos, int iSkipArmor ); +void Damage_Apply( entity eTarget, entity eAttacker, float fDamage, vector vHitPos, int iSkipArmor ); void Client_TriggerCamera( entity eTarget, vector vPos, vector vEndPos, float fResetTime ); entity eActivator; diff --git a/Source/server/entry.c b/Source/server/entry.c index 451c76bb..a390450b 100644 --- a/Source/server/entry.c +++ b/Source/server/entry.c @@ -51,6 +51,7 @@ void PutClientInServer(void) void PlayerPreThink(void) { Game_PlayerPreThink(); + Input_Handle(); } void PlayerPostThink(void) diff --git a/Source/server/spawn.c b/Source/server/spawn.c new file mode 100644 index 00000000..9999d754 --- /dev/null +++ b/Source/server/spawn.c @@ -0,0 +1,70 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +float Spawn_PlayerRange(entity spot) { + entity pl; + float bestdist; + float dist; + + bestdist = 9999999; + + for (pl = world; (pl = find(pl, classname, "player"));) { + if (pl->health <= 0) { + continue; + } + dist = vlen(spot.origin - pl.origin); + if (dist < bestdist) { + bestdist = dist; + } + } + + return bestdist; +} + +entity Spawn_SelectRandom(string cname) +{ + static entity lastspot; + entity spot = lastspot; + + for (int i = random(1, 5); i > 0; i--) { + spot = find(spot, classname, cname); + } + + if (spot == __NULL__) { + spot = find(spot, classname, cname); + } + + entity eFirstSpot = spot; + do { + if (spot) { + if (Spawn_PlayerRange(spot) > 128) { + if (spot.origin == [0,0,0]) { + spot = find(spot, classname, cname); + continue; + } + lastspot = spot; + return spot; + } + } + spot = find(spot, classname, cname); + } while (spot != eFirstSpot); + + if (!spot) { + lastspot = spot; + return spot; + } + + // We still haven't found one + if (spot == __NULL__) { + error(sprintf("Spawn_SelectRandom: no %s on level", cname)); + return world; + } + + lastspot = spot; + return spot; +} diff --git a/Source/server/cstrike/traceattack.c b/Source/server/traceattack.c similarity index 92% rename from Source/server/cstrike/traceattack.c rename to Source/server/traceattack.c index 4a88d623..59c16ec5 100755 --- a/Source/server/cstrike/traceattack.c +++ b/Source/server/traceattack.c @@ -24,11 +24,18 @@ void TraceAttack_FireSingle( vector vPos, vector vAngle ) { TraceAttack_FireSingle( vPos, vAngle ); iTotalPenetrations = 1; } + +#ifdef CSTRIKE traceline( vPos, vPos + ( vAngle * wptTable[ self.weapon ].fRange ), MOVE_HITMODEL, self); - +#else + traceline( vPos, vPos + ( vAngle * 8196 ), MOVE_HITMODEL, self); +#endif + if (trace_fraction != 1.0) { if ( trace_ent.takedamage == DAMAGE_YES ) { +#ifdef CSTRIKE Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, trace_endpos, FALSE ); +#endif } if ( trace_ent.iBleeds == TRUE ) { @@ -75,18 +82,25 @@ void TraceAttack_FireSingleLagged( vector vPos, vector vAngle ) { TraceAttack_FireSingle( vPos, vAngle ); iTotalPenetrations = 1; } + +#ifdef CSTRIKE traceline( vPos, vPos + ( vAngle * wptTable[ self.weapon ].fRange ), MOVE_LAGGED | MOVE_HITMODEL, self); - +#else + traceline( vPos, vPos + ( vAngle * 8196 ), MOVE_LAGGED | MOVE_HITMODEL, self); +#endif + if (trace_fraction != 1.0) { if ( trace_ent.takedamage == DAMAGE_YES ) { +#ifdef CSTRIKE Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, trace_endpos, FALSE ); +#endif } - + if ( trace_ent.iBleeds == TRUE ) { Effect_Impact( IMPACT_FLESH, trace_endpos, trace_plane_normal ); } else { string sTexture = getsurfacetexture( trace_ent, getsurfacenearpoint( trace_ent, trace_endpos ) ); - + switch( (float)hash_get( hashMaterials, sTexture ) ) { case 'G': case 'V': @@ -128,14 +142,16 @@ Fire a given amount of shots void TraceAttack_FireBullets( int iShots, vector vPos ) { vector vDir; makevectors(self.v_angle); - + while ( iShots > 0 ) { iTotalPenetrations = 0; +#ifdef CSTRIKE vDir = aim( self, 100000 ) + Math_CRandom()*self.fAccuracy*v_right + Math_CRandom()*self.fAccuracy*v_up; +#else + vDir = aim( self, 100000 ); +#endif TraceAttack_FireSingle( vPos, vDir ); TraceAttack_FireSingleLagged( vPos, vDir ); iShots--; } - - dprint( sprintf( "[DEBUG] ACCURACY: %f, %d %d %d\n", self.fAccuracy, vDir_x, vDir_y, vDir_z )); } diff --git a/Source/server/valve.src b/Source/server/valve.src index 0835994b..5996ca8c 100755 --- a/Source/server/valve.src +++ b/Source/server/valve.src @@ -1,12 +1,13 @@ #pragma target fte #pragma progs_dat "../../valve/progs.dat" -#define SSQC +#define QWSSQC #define VALVE #includelist ../builtins.h ../defs.h +valve/defs.h ../math.h ../materials.h ../events.h @@ -14,13 +15,36 @@ defs.h ../gs-entbase/server.src +valve/monster_rat.cpp ../shared/effects.c ../shared/spraylogo.cpp -../shared/pmove.c +../shared/valve/player.cpp valve/player.c +../shared/pmove.c valve/spectator.c +../shared/valve/items.h +../shared/valve/crosshair.h +../shared/valve/weapons.h +../shared/valve/w_crowbar.c +../shared/valve/w_glock.c +../shared/valve/w_python.c +../shared/valve/w_mp5.c +../shared/valve/w_crossbow.c +../shared/valve/w_shotgun.c +../shared/valve/w_rpg.c +../shared/valve/w_gauss.c +../shared/valve/w_egon.c +../shared/valve/w_hornetgun.c +../shared/valve/w_handgrenade.c +../shared/valve/w_tripmine.c +../shared/valve/w_satchel.c +../shared/valve/w_snark.c +valve/items.cpp +../shared/valve/weapons.c + +spawn.c valve/client.c client.c @@ -28,9 +52,12 @@ client.c valve/server.c server.c -damage.c +valve/damage.c +traceattack.c vox.c +valve/input.c + valve/spawn.c footsteps.c entry.c diff --git a/Source/server/valve/client.c b/Source/server/valve/client.c index 468e6955..2e1989c9 100644 --- a/Source/server/valve/client.c +++ b/Source/server/valve/client.c @@ -6,13 +6,16 @@ * ****/ + +void Empty(void) {} + void Game_ClientConnect(void) { - bprint(sprintf("%s connected\n", self.netname)); + bprint(PRINT_HIGH, sprintf("%s connected\n", self.netname)); } void Game_ClientDisconnect(void) { - bprint(sprintf("%s disconnected\n", self.netname)); + bprint(PRINT_HIGH, sprintf("%s disconnected\n", self.netname)); } void Game_ClientKill(void) { @@ -35,61 +38,127 @@ void Game_RunClientCommand(void) void Game_DecodeChangeParms(void) { + player pl = (player)self; g_landmarkpos[0] = parm1; g_landmarkpos[1] = parm2; g_landmarkpos[2] = parm3; - self.angles[0] = parm4; - self.angles[1] = parm5; - self.angles[2] = parm6; + pl.angles[0] = parm4; + pl.angles[1] = parm5; + pl.angles[2] = parm6; + pl.velocity[0] = parm7; + pl.velocity[1] = parm8; + pl.velocity[2] = parm9; + pl.items = parm10; + pl.activeweapon = parm11; } void Game_SetChangeParms(void) { + player pl = (player)self; parm1 = g_landmarkpos[0]; parm2 = g_landmarkpos[1]; parm3 = g_landmarkpos[2]; - parm4 = self.angles[0]; - parm5 = self.angles[1]; - parm6 = self.angles[2]; + parm4 = pl.angles[0]; + parm5 = pl.angles[1]; + parm6 = pl.angles[2]; + parm7 = pl.velocity[0]; + parm8 = pl.velocity[1]; + parm9 = pl.velocity[2]; + parm10 = pl.items; + parm11 = pl.activeweapon; } void Game_PutClientInServer(void) { - if ( cvar( "sv_playerslots" ) == 1 ) { - entity spot; - self.SendEntity = Player_SendEntity; - - Game_DecodeChangeParms(); - - if (startspot) { - setorigin(self, Landmark_GetSpot()); - self.fixangle = TRUE; - } else { - spot = find( world, classname, "info_player_start" ); - //self.origin = spot.origin; - setorigin(self, spot.origin); - self.angles = spot.angles; - self.fixangle = TRUE; - } + if (self.classname != "player") { + spawnfunc_player(); } - - self.classname = "player"; - self.health = self.max_health = 100; + player pl = (player)self; + + entity spot; + + pl.classname = "player"; + pl.health = self.max_health = 100; //forceinfokey( self, "*dead", "0" ); - self.takedamage = DAMAGE_YES; - self.solid = SOLID_SLIDEBOX; - self.movetype = MOVETYPE_WALK; - self.flags = FL_CLIENT; - self.viewzoom = 1.0; - setmodel( self, "models/player.mdl" ); - setsize( self, VEC_HULL_MIN, VEC_HULL_MAX ); - self.view_ofs = VEC_PLAYER_VIEWPOS; - self.velocity = '0 0 0'; - self.frame = 1; - forceinfokey( self, "*spec", "0" ); + pl.takedamage = DAMAGE_YES; + pl.solid = SOLID_SLIDEBOX; + pl.movetype = MOVETYPE_WALK; + pl.flags = FL_CLIENT; + pl.viewzoom = 1.0; + setmodel(pl, "models/player.mdl"); + setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX); + pl.view_ofs = VEC_PLAYER_VIEWPOS; + pl.velocity = [0,0,0]; + pl.frame = 1; + pl.SendEntity = Player_SendEntity; + pl.customphysics = Empty; + pl.vPain = Player_Pain; + pl.vDeath = Player_Death; + forceinfokey(pl, "*spec", "0" ); + + if ( cvar( "sv_playerslots" ) == 1 ) { + Game_DecodeChangeParms(); + if (startspot) { + setorigin(pl, Landmark_GetSpot()); + } else { + spot = find(world, classname, "info_player_start"); + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + } + } else { + spot = Spawn_SelectRandom("info_player_deathmatch"); + setorigin(pl, spot.origin); + pl.angles = spot.angles; + pl.fixangle = TRUE; + + pl.ammo_9mm = 68; + Weapons_AddItem(pl, WEAPON_CROWBAR); + Weapons_AddItem(pl, WEAPON_GLOCK); + } +} + +void SV_SendChat(entity eSender, string sMessage, entity eEnt, float fType) +{ + WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET ); + WriteByte( MSG_MULTICAST, fType == 0 ? EV_CHAT:EV_CHAT_TEAM ); + WriteByte( MSG_MULTICAST, num_for_edict( eSender ) - 1 ); + WriteByte( MSG_MULTICAST, eSender.team ); + WriteString( MSG_MULTICAST, sMessage ); + if (eEnt) { + msg_entity = eEnt; + multicast( [0,0,0], MULTICAST_ONE ); + } else { + multicast( [0,0,0], MULTICAST_ALL ); + } } void Game_ParseClientCommand(string cmd) { + tokenize( cmd ); + + /*if ( argv( 1 ) == "timeleft" ) { + float fTimeLeft = cvar( "mp_timelimit" ) - ( time / 60 ); + Vox_Singlecast( self, sprintf( "we have %s minutes remaining", Vox_TimeToString( fTimeLeft ) ) ); + return; + }*/ + + string chat = substring( cmd, 4, strlen( cmd ) - 4 ); + + // Players talk to players, spectators to spectators. + if ( argv( 0 ) == "say" ) { + localcmd( sprintf( "echo %s: %s\n", self.netname, chat ) ); + SV_SendChat( self, chat, world, 0 ); + return; + } else if ( argv( 0 ) == "say_team" ) { + localcmd( sprintf( "echo [TEAM %d] %s: %s\n", self.team, self.netname, chat ) ); + for ( entity eFind = world; ( eFind = find( eFind, classname, "player" ) ); ) { + if ( eFind.team == self.team ) { + SV_SendChat( self, chat, eFind, 1 ); + } + } + return; + } + clientcommand(self, cmd); } diff --git a/Source/server/valve/damage.c b/Source/server/valve/damage.c new file mode 100755 index 00000000..5f2bfa24 --- /dev/null +++ b/Source/server/valve/damage.c @@ -0,0 +1,169 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +/* +================= +Damage_CastOrbituary + +Sends a message to the clients to display a death message +================= +*/ +void Damage_CastOrbituary( entity eAttacker, entity eTarget, float fWeapon) { + WriteByte( MSG_BROADCAST, SVC_CGAMEPACKET ); + WriteByte( MSG_BROADCAST, EV_ORBITUARY ); + WriteByte( MSG_BROADCAST, num_for_edict( eAttacker ) - 1 ); + WriteByte( MSG_BROADCAST, eAttacker.team ); + WriteByte( MSG_BROADCAST, num_for_edict( eTarget ) - 1 ); + WriteByte( MSG_BROADCAST, eTarget.team ); + WriteByte( MSG_BROADCAST, fWeapon ); + msg_entity = self; + multicast( [0,0,0], MULTICAST_ALL ); +} + +/* +================= +Damage_Apply + +Generic function that applies damage, pain and suffering +================= +*/ +void Damage_Apply(entity eTarget, entity eAttacker, float fDamage, vector vHitPos, int a) +{ + // Apply the damage finally + if ( eTarget.armor ) { + float flArmor; + float flNewDamage; + + flNewDamage = fDamage * 0.2; + flArmor = (fDamage - flNewDamage) * 0.5; + + if (flArmor > eTarget.armor) { + flArmor = eTarget.armor; + flArmor *= (1/0.5); + flNewDamage = fDamage - flArmor; + eTarget.armor = 0; + } else { + eTarget.armor -= flArmor; + } + fDamage = flNewDamage; + } + + eTarget.health -= fDamage; + eTarget.dmg_take = fDamage; + eTarget.dmg_inflictor = eAttacker; + + // Target is dead and a client.... + if (eTarget.health <= 0) { + if (eTarget.flags & FL_CLIENT) { + //eTarget.fDeaths++; + //forceinfokey( eTarget, "*deaths", ftos( eTarget.fDeaths ) ); + } + + if ((eTarget.flags & FL_CLIENT) && (eAttacker.flags & FL_CLIENT)) { + eAttacker.frags++; + Damage_CastOrbituary(eAttacker, eTarget, eAttacker.weapon ); + } + } + + entity eOld = self; + self = eTarget; + + if (self.health <= 0) { + self.health = 0; + self.vDeath(trace_surface_id); + } else { + self.vPain(trace_surface_id); + } + + self = eOld; +} + +/* +================= +Damage_CheckAttack + +This verifies that the entity is actually able to receive some damage, +from a plain geographical standpoint +================= +*/ +float Damage_CheckAttack( entity eTarget, vector vAttackPos ) { + if ( eTarget.movetype == MOVETYPE_PUSH ) { + traceline( vAttackPos, 0.5 * ( eTarget.absmin + eTarget.absmax ), TRUE, self ); + + if ( trace_fraction == 1 ) { + return TRUE; + } + if ( trace_ent == eTarget ) { + return TRUE; + } + return FALSE; + } + + traceline( vAttackPos, eTarget.origin, TRUE, self ); + if ( trace_fraction == 1 ) { + return TRUE; + } + traceline( vAttackPos, eTarget.origin + '15 15 0', TRUE, self ); + if ( trace_fraction == 1 ) { + return TRUE; + } + traceline( vAttackPos, eTarget.origin + '-15 -15 0', TRUE, self ); + if ( trace_fraction == 1 ) { + return TRUE; + } + traceline( vAttackPos, eTarget.origin + '-15 15 0', TRUE, self ); + if ( trace_fraction == 1 ) { + return TRUE; + } + traceline( vAttackPos, eTarget.origin + '15 -15 0', TRUE, self ); + if ( trace_fraction == 1 ) { + return TRUE; + } + + return FALSE; +} + +/* +================= +Damage_Radius + +Even more pain and suffering, mostly used for explosives +================= +*/ +void Damage_Radius( vector vOrigin, entity eAttacker, float fDamage, float fRadius, int iCheckClip ) { + for ( entity eDChain = world; ( eDChain = findfloat( eDChain, takedamage, DAMAGE_YES ) ); ) { + vector vecRealPos; + vecRealPos[0] = eDChain.absmin[0] + ( 0.5 * ( eDChain.absmax[0] - eDChain.absmin[0] ) ); + vecRealPos[1] = eDChain.absmin[1] + ( 0.5 * ( eDChain.absmax[1] - eDChain.absmin[1] ) ); + vecRealPos[2] = eDChain.absmin[2] + ( 0.5 * ( eDChain.absmax[2] - eDChain.absmin[2] ) ); + + float fDist = vlen( vOrigin - vecRealPos ); + //vector vPush; + + if ( fDist > fRadius ) { + continue; + } + + if ( Damage_CheckAttack( eDChain, vOrigin ) || iCheckClip == FALSE ) { + float fDiff = vlen( vOrigin - vecRealPos ); + + fDiff = ( fRadius - fDiff ) / fRadius; + fDamage = rint(fDamage * fDiff); + + if ( fDiff > 0 ) { + Damage_Apply( eDChain, eAttacker, fDamage, eDChain.origin, 0 ); + /*if ( eDChain.movetype != MOVETYPE_NONE ) { + vPush = vectoangles( vecRealPos - vOrigin ); + makevectors( vPush ); + eDChain.velocity += ( v_forward * fDamage * 5 ) + ( v_up * fDamage * 2.5 ); + }*/ + } + + } + } +} diff --git a/Source/server/valve/defs.h b/Source/server/valve/defs.h new file mode 100644 index 00000000..db3b7f36 --- /dev/null +++ b/Source/server/valve/defs.h @@ -0,0 +1 @@ +void Damage_Apply( entity eTarget, entity eAttacker, float iDamage, vector vHitPos, int bla); diff --git a/Source/server/valve/input.c b/Source/server/valve/input.c new file mode 100755 index 00000000..ed959d69 --- /dev/null +++ b/Source/server/valve/input.c @@ -0,0 +1,35 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +/* +================= +Input_Handle + +Handles impulse and whatnot +================= +*/ +void Input_Handle(void) +{ + if (self.button0) { + Weapons_Primary(); + } else if (self.button4) { + Weapons_Reload(); + } else if (self.button3) { + Weapons_Secondary(); + } else { + Weapons_Release(); + } + + if ( self.button5 ) { + Player_UseDown(); + } else { + Player_UseUp(); + } + + self.impulse = 0; +} diff --git a/Source/server/valve/items.cpp b/Source/server/valve/items.cpp new file mode 100644 index 00000000..bff1580c --- /dev/null +++ b/Source/server/valve/items.cpp @@ -0,0 +1,67 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +/* WEAPON ITEMS */ +class itemweapon:CBaseEntity +{ + int id; + void() itemweapon; + virtual void() touch; + virtual void(int i) setitem; + + virtual void() Respawn; +}; + +void itemweapon::touch(void) +{ + if (other.classname == "player") { + if (Weapons_IsPresent((player)other, id) == TRUE) { + return; + } + sound(other, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM); + Weapons_AddItem((player)other, id); + + if (cvar("sv_playerslots") == 1) { + remove(self); + } else { + Hide(); + think = Respawn; + nextthink = time + 30.0f; + } + } +} + +void itemweapon::setitem(int i) +{ + id = i; + m_oldModel = Weapons_GetWorldmodel(id); + setmodel(this, m_oldModel); +} + +void itemweapon::Respawn(void) +{ + solid = SOLID_TRIGGER; + movetype = MOVETYPE_TOSS; + setsize(this, [-24,-24,-16], [24,24,16]); + setorigin(this, origin); + + /* At some points, the item id might not yet be set */ + if (m_oldModel) { + setmodel(this, m_oldModel); + } + + think = __NULL__; + nextthink = -1; + sound(this, CHAN_ITEM, "items/suitchargeok1.wav", 1, ATTN_NORM); +} + +void itemweapon::itemweapon(void) +{ + CBaseEntity::CBaseEntity(); + Respawn(); +} diff --git a/Source/server/valve/monster_rat.cpp b/Source/server/valve/monster_rat.cpp new file mode 100644 index 00000000..9bfb722a --- /dev/null +++ b/Source/server/valve/monster_rat.cpp @@ -0,0 +1,22 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +class monster_rat:CBaseEntity +{ + void() monster_rat; +}; + +void monster_rat::monster_rat(void) +{ + CBaseEntity::CBaseEntity(); + precache_model("models/bigrat.mdl"); + solid = SOLID_SLIDEBOX; + movetype = MOVETYPE_WALK; + setmodel(this, "models/bigrat.mdl"); + setorigin(this, origin); +} diff --git a/Source/server/valve/player.c b/Source/server/valve/player.c index ff57a33f..6f50f929 100644 --- a/Source/server/valve/player.c +++ b/Source/server/valve/player.c @@ -1,3 +1,80 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +void Player_Pain(void) +{ + +} + +void Player_Death(void) +{ + player pl = (player)self; + pl.movetype = MOVETYPE_NONE; + pl.health = pl.armor = pl.activeweapon = pl.items = 0; + PutClientInServer(); +} + +/* +==================== +UseWorkaround +==================== +*/ +void UseWorkaround( entity eTarget ) +{ + eActivator = self; + entity eOldSelf = self; + self = eTarget; + self.PlayerUse(); + self = eOldSelf; +} + +/* +==================== +Player_UseDown +==================== +*/ +void Player_UseDown(void) +{ + if ( self.health <= 0 ) { + return; + } else if ( !( self.gflags & GF_USE_RELEASED ) ) { + return; + } + + vector vSource; + + makevectors(self.v_angle); + vSource = self.origin + self.view_ofs; + traceline ( vSource, vSource + ( v_forward * 64 ), FALSE, self); + + if (trace_ent.PlayerUse) { + if (trace_ent.classname != "func_pushable") { + self.gflags &= ~GF_USE_RELEASED; + sound( self, CHAN_ITEM, "common/wpn_select.wav", 0.25, ATTN_IDLE ); + } + + UseWorkaround(trace_ent); + } else { + sound( self, CHAN_ITEM, "common/wpn_denyselect.wav", 0.25, ATTN_IDLE ); + self.gflags &= ~GF_USE_RELEASED; + } +} + +/* +==================== +Player_UseUp +==================== +*/ +void Player_UseUp( void ) { + if ( !( self.gflags & GF_USE_RELEASED ) ) { + self.gflags |= GF_USE_RELEASED; + } +} /* ================= @@ -6,27 +83,43 @@ Player_SendEntity */ float Player_SendEntity(entity ePEnt, float fChanged) { - if (self.health <= 0 && ePEnt != self) { + player pl = (player)self; + if (pl.health <= 0 && ePEnt != pl) { return FALSE; } WriteByte(MSG_ENTITY, ENT_PLAYER); - WriteShort(MSG_ENTITY, self.modelindex); - WriteCoord(MSG_ENTITY, self.origin[0]); - WriteCoord(MSG_ENTITY, self.origin[1]); - WriteCoord(MSG_ENTITY, self.origin[2]); - WriteCoord(MSG_ENTITY, self.v_angle[0]); - WriteCoord(MSG_ENTITY, self.angles[1]); - WriteCoord(MSG_ENTITY, self.angles[2]); - WriteCoord(MSG_ENTITY, self.velocity[0]); - WriteCoord(MSG_ENTITY, self.velocity[1]); - WriteCoord(MSG_ENTITY, self.velocity[2]); - WriteFloat(MSG_ENTITY, self.flags); - WriteFloat(MSG_ENTITY, self.pmove_flags); - WriteByte(MSG_ENTITY, self.weapon); - WriteByte(MSG_ENTITY, self.health); - WriteFloat(MSG_ENTITY, self.movetype); - WriteFloat(MSG_ENTITY, self.view_ofs[2]); - WriteFloat(MSG_ENTITY, self.viewzoom); + WriteShort(MSG_ENTITY, pl.modelindex); + WriteCoord(MSG_ENTITY, pl.origin[0]); + WriteCoord(MSG_ENTITY, pl.origin[1]); + WriteCoord(MSG_ENTITY, pl.origin[2]); + WriteCoord(MSG_ENTITY, pl.v_angle[0]); + WriteCoord(MSG_ENTITY, pl.angles[1]); + WriteCoord(MSG_ENTITY, pl.angles[2]); + WriteCoord(MSG_ENTITY, pl.velocity[0]); + WriteCoord(MSG_ENTITY, pl.velocity[1]); + WriteCoord(MSG_ENTITY, pl.velocity[2]); + WriteFloat(MSG_ENTITY, pl.flags); + WriteByte(MSG_ENTITY, pl.activeweapon); + WriteFloat(MSG_ENTITY, pl.items); + WriteByte(MSG_ENTITY, pl.health); + WriteByte(MSG_ENTITY, pl.armor); + WriteFloat(MSG_ENTITY, pl.movetype); + WriteFloat(MSG_ENTITY, pl.view_ofs[2]); + WriteFloat(MSG_ENTITY, pl.viewzoom); + + WriteByte(MSG_ENTITY, pl.a_ammo1); + WriteByte(MSG_ENTITY, pl.a_ammo2); + WriteByte(MSG_ENTITY, pl.a_ammo3); + WriteFloat(MSG_ENTITY, pl.w_attack_next); + WriteFloat(MSG_ENTITY, pl.w_idle_next); return TRUE; } + +void Weapons_Draw(void); +void CSEv_PlayerSwitchWeapon_f(float w) +{ + player pl = (player)self; + pl.activeweapon = (int)w; + Weapons_Draw(); +} diff --git a/Source/server/valve/server.c b/Source/server/valve/server.c index 27e50e47..317a2b5e 100644 --- a/Source/server/valve/server.c +++ b/Source/server/valve/server.c @@ -18,5 +18,7 @@ float Game_ConsoleCmd(string cmd) void Game_Worldspawn(void) { - + precache_file("decals.wad"); + precache_model("models/player.mdl"); + Weapons_Init(); } diff --git a/Source/shared/cstrike/animations.c b/Source/shared/cstrike/animations.c index beeaea21..47b77242 100755 --- a/Source/shared/cstrike/animations.c +++ b/Source/shared/cstrike/animations.c @@ -121,7 +121,7 @@ void Animation_Print( string sWow ) { #ifdef CSQC print( sprintf( "[DEBUG] %s", sWow ) ); #else - bprint( sprintf( "SSQC: %s", sWow ) ); + bprint(PRINT_HIGH, sprintf( "SSQC: %s", sWow ) ); #endif } diff --git a/Source/shared/cstrike/player.cpp b/Source/shared/cstrike/player.cpp new file mode 100644 index 00000000..10748755 --- /dev/null +++ b/Source/shared/cstrike/player.cpp @@ -0,0 +1,28 @@ + +class player +{ + entity p_model; + int p_hand_bone; + int p_model_bone; + + vector netorigin; + vector netvelocity; + float netflags; + + float activeweapon; + float weapons; + float lastweapon; + + float health; + float armor; + float pitch; + float viewzoom; + + vector view_ofs; + +#ifdef CSQC + virtual void() gun_offset; + virtual void() draw; + virtual float() predraw; +#endif +}; diff --git a/Source/shared/effects.c b/Source/shared/effects.c index d4b155de..f20356f1 100755 --- a/Source/shared/effects.c +++ b/Source/shared/effects.c @@ -122,17 +122,17 @@ void Effect_Impact( int iType, vector vPos, vector vNormal ) { case IMPACT_EXPLOSION: break; case IMPACT_GLASS: - pointparticles( DECAL_GLASS, vPos, vNormal, 1 ); + //pointparticles( DECAL_GLASS, vPos, vNormal, 1 ); pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 ); break; case IMPACT_WOOD: - pointparticles( DECAL_SHOT, vPos, vNormal, 1 ); + //pointparticles( DECAL_SHOT, vPos, vNormal, 1 ); pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 ); pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 ); pointparticles( PARTICLE_SMOKE_BROWN, vPos, vNormal, 1 ); break; case IMPACT_METAL: - pointparticles( DECAL_SHOT, vPos, vNormal, 1 ); + //pointparticles( DECAL_SHOT, vPos, vNormal, 1 ); pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 ); pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 ); pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 ); @@ -141,7 +141,7 @@ void Effect_Impact( int iType, vector vPos, vector vNormal ) { pointparticles( PARTICLE_BLOOD, vPos, vNormal, 1 ); break; case IMPACT_DEFAULT: - pointparticles( DECAL_SHOT, vPos, vNormal, 1 ); + //pointparticles( DECAL_SHOT, vPos, vNormal, 1 ); pointparticles( PARTICLE_SPARK, vPos, vNormal, 1 ); pointparticles( PARTICLE_PIECES_BLACK, vPos, vNormal, 1 ); pointparticles( PARTICLE_SMOKE_GREY, vPos, vNormal, 1 ); diff --git a/Source/shared/pmove.c b/Source/shared/pmove.c index 53321366..65025de6 100644 --- a/Source/shared/pmove.c +++ b/Source/shared/pmove.c @@ -6,10 +6,14 @@ * ****/ +#define AIRCONTROL + #define PHY_JUMP_CHAINWINDOW 0.5 #define PHY_JUMP_CHAIN 100 #define PHY_JUMP_CHAINDECAY 50 +#define FL_JUMPRELEASED 4096 + /*FIXME: jumptime should use the time global, as time intervals are not predictable - decrement it based upon input_timelength*/ .float jumptime; .float waterlevel; @@ -29,10 +33,18 @@ void PMove_Init(void) { localcmd("serverinfo phy_airstepheight 18\n"); localcmd("serverinfo phy_friction 4\n"); localcmd("serverinfo phy_edgefriction 1\n"); - localcmd("serverinfo phy_accelerate 4\n"); localcmd("serverinfo phy_stopspeed 75\n"); localcmd("serverinfo phy_gravity 800\n"); + +#ifdef CSTRIKE + localcmd("serverinfo phy_accelerate 4\n"); localcmd("serverinfo phy_maxspeed 240\n"); +#endif + +#ifdef VALVE + localcmd("serverinfo phy_accelerate 8\n"); + localcmd("serverinfo phy_maxspeed 270\n"); +#endif } /* @@ -657,6 +669,28 @@ PMove_Run */ void PMove_Run(void) { + +#ifdef VALVE + + self.maxspeed = (self.flags & FL_CROUCHING) ? 135 : 270; + + if (input_buttons & INPUT_BUTTON5) { + input_movevalues *= 0.50; + } + + player pl = (player)self; + + pl.w_attack_next -= input_timelength; + pl.w_idle_next -= input_timelength; + + if (pl.w_attack_next <= 0) { + pl.w_attack_next = 0; + } + if (pl.w_idle_next <= 0) { + pl.w_idle_next = 0; + } +#endif + PMove_WaterMove(); if (self.waterlevel >= 2) { diff --git a/Source/shared/valve/animations.c b/Source/shared/valve/animations.c new file mode 100755 index 00000000..fb8332af --- /dev/null +++ b/Source/shared/valve/animations.c @@ -0,0 +1,262 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +.float baseframe_time; +.float baseframe_old; +.float fWasCrouching; + +// For lerping, sigh +#ifdef CSQC +.float frame_last; +.float baseframe_last; +#else +.float subblend2frac; +#endif + +void Animation_Print( string sWow ) { +#ifdef CSQC + print( sprintf( "[DEBUG] %s", sWow ) ); +#else + bprint(PRINT_HIGH, sprintf( "SSQC: %s", sWow ) ); +#endif +} + +/* +================= +Animation_PlayerUpdate + +Called every frame to update the animation sequences +depending on what the player is doing +================= +*/ +void Animation_PlayerUpdate( void ) { + self.basebone = 40; + /* + // TODO: Make this faster + if ( self.baseframe_time < time ) { + switch ( Weapon_GetAnimType( self.weapon ) ) { + case ATYPE_AK47: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_AK47 : ANIM_AIM_AK47; + break; + case ATYPE_C4: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_C4 : ANIM_AIM_C4; + break; + case ATYPE_CARBINE: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_CARBINE : ANIM_AIM_CARBINE; + break; + case ATYPE_DUALPISTOLS: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_DUALPISTOLS : ANIM_AIM_DUALPISTOLS; + break; + case ATYPE_GRENADE: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_GRENADE : ANIM_AIM_GRENADE; + break; + case ATYPE_KNIFE: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_KNIFE : ANIM_AIM_KNIFE; + break; + case ATYPE_MP5: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_MP5 : ANIM_AIM_MP5; + break; + case ATYPE_ONEHAND: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_ONEHAND : ANIM_AIM_ONEHAND; + break; + case ATYPE_PARA: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_PARA : ANIM_AIM_PARA; + break; + case ATYPE_RIFLE: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_RIFLE : ANIM_AIM_RIFLE; + break; + case ATYPE_SHOTGUN: + self.baseframe = self.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_SHOTGUN : ANIM_AIM_SHOTGUN; + break; + } + self.baseframe_old = self.baseframe; + } + + if ( !( self.flags & FL_ONGROUND ) ) { + self.frame = ANIM_JUMP; + } else if ( vlen( self.velocity ) == 0 ) { + if ( self.flags & FL_CROUCHING ) { + self.frame = ANIM_IDLE_CROUCH; + } else { + self.frame = ANIM_IDLE; + } + } else if ( vlen( self.velocity ) < 150 ) { + if ( self.flags & FL_CROUCHING ) { + self.frame = ANIM_RUN_CROUCH; + } else { + self.frame = ANIM_WALK; + } + } else if ( vlen( self.velocity ) > 150 ) { + if ( self.flags & FL_CROUCHING ) { + self.frame = ANIM_RUN_CROUCH; + } else { + self.frame = ANIM_RUN; + } + }*/ + +#ifdef CSQC + // Lerp it down! + if ( self.lerpfrac > 0 ) { + self.lerpfrac -= frametime * 5; + if ( self.lerpfrac < 0 ) { + self.lerpfrac = 0; + } + } + + if ( self.baselerpfrac > 0 ) { + self.baselerpfrac -= frametime * 5; + if ( self.baselerpfrac < 0 ) { + self.baselerpfrac = 0; + } + } + + if ( self.frame != self.frame_last ) { + //Animation_Print( sprintf( "New Frame: %d, Last Frame: %d\n", self.frame, self.frame_last )); + + // Move everything over to frame 2 + self.frame2time = self.frame1time; + self.frame2 = self.frame_last; + + // Set frame_last to avoid this being called again + self.frame_last = self.frame; + + self.lerpfrac = 1.0f; + self.frame1time = 0.0f; + } + + if ( self.baseframe != self.baseframe_last ) { + //Animation_Print( sprintf( "New Baseframe: %d, Last Baseframe: %d\n", self.baseframe, self.baseframe_last ) ); + + // Move everything over to frame 2 + self.baseframe2time = self.baseframe1time; + self.baseframe2 = self.baseframe_last; + + // Set frame_last to avoid this being called again + self.baseframe_last = self.baseframe; + + self.baselerpfrac = 1.0f; + self.baseframe1time = 0.0f; + } + + self.bonecontrol1 = self.angles_x; +#endif + self.angles_x = self.angles_z = 0; + + if ( !( self.flags & FL_ONGROUND ) ) { + /*self.frame = ANIM_JUMP;*/ + } + + // Force the code above to update if we switched positions + if ( self.fWasCrouching != ( self.flags & FL_CROUCHING ) ) { + self.baseframe_old = 0; + self.baseframe_time = 0; + self.fWasCrouching = ( self.flags & FL_CROUCHING ); + } + +#ifdef SSQC + // On the CSQC it's done in Player.c + self.subblend2frac = self.v_angle_x / 90; +#endif +} + +/* +================= +Animation_PlayerTop + +Changes the animation sequence for the upper body part +================= +*/ +void Animation_PlayerTop( float fFrame ) { + self.baseframe = fFrame; + self.baseframe_old = fFrame; +} + +void Animation_PlayerTopTemp( float fFrame, float fTime ) { + self.baseframe = fFrame; + self.baseframe_time = time + fTime; +} + +void Animation_ShootWeapon( entity ePlayer ) { + /*switch ( Weapon_GetAnimType( ePlayer.weapon ) ) { + case ATYPE_AK47: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_AK47 : ANIM_SHOOT_AK47; + break; + case ATYPE_C4: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_C4 : ANIM_SHOOT_C4; + break; + case ATYPE_CARBINE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_CARBINE : ANIM_SHOOT_CARBINE; + break; + case ATYPE_DUALPISTOLS: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_DUALPISTOLS : ANIM_SHOOT_DUALPISTOLS; + break; + case ATYPE_GRENADE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_GRENADE : ANIM_SHOOT_GRENADE; + break; + case ATYPE_KNIFE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_KNIFE : ANIM_SHOOT_KNIFE; + break; + case ATYPE_MP5: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_MP5 : ANIM_SHOOT_MP5; + break; + case ATYPE_ONEHAND: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_ONEHAND : ANIM_SHOOT_ONEHAND; + break; + case ATYPE_PARA: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_PARA : ANIM_SHOOT_PARA; + break; + case ATYPE_RIFLE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_RIFLE : ANIM_SHOOT_RIFLE; + break; + case ATYPE_SHOTGUN: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_SHOOT_SHOTGUN : ANIM_SHOOT_SHOTGUN; + break; + } + + ePlayer.baseframe_time = time + Weapon_GetFireRate( ePlayer.weapon );*/ +} + +void Animation_ReloadWeapon( entity ePlayer ) { + /*switch ( Weapon_GetAnimType( ePlayer.weapon ) ) { + case ATYPE_AK47: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_AK47 : ANIM_RELOAD_AK47; + break; + case ATYPE_C4: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_C4 : ANIM_AIM_C4; + break; + case ATYPE_CARBINE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_CARBINE : ANIM_RELOAD_CARBINE; + break; + case ATYPE_DUALPISTOLS: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_DUALPISTOLS : ANIM_RELOAD_DUALPISTOLS; + break; + case ATYPE_GRENADE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_GRENADE : ANIM_AIM_GRENADE; + break; + case ATYPE_KNIFE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_AIM_KNIFE : ANIM_AIM_KNIFE; + break; + case ATYPE_MP5: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_MP5 : ANIM_RELOAD_MP5; + break; + case ATYPE_ONEHAND: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_ONEHAND : ANIM_RELOAD_ONEHAND; + break; + case ATYPE_PARA: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_PARA : ANIM_RELOAD_PARA; + break; + case ATYPE_RIFLE: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_RIFLE : ANIM_RELOAD_RIFLE; + break; + case ATYPE_SHOTGUN: + ePlayer.baseframe = ePlayer.flags & FL_CROUCHING ? ANIM_CROUCH_RELOAD_SHOTGUN : ANIM_RELOAD_SHOTGUN; + break; + } + + ePlayer.baseframe_time = time + Weapon_GetReloadTime( ePlayer.weapon );*/ +} diff --git a/Source/shared/valve/crosshair.h b/Source/shared/valve/crosshair.h new file mode 100644 index 00000000..d3f9b0d3 --- /dev/null +++ b/Source/shared/valve/crosshair.h @@ -0,0 +1,8 @@ +typedef struct +{ + string frame; + float x; + float y; + float w; + float h; +} crosshair_t; diff --git a/Source/shared/valve/items.h b/Source/shared/valve/items.h new file mode 100644 index 00000000..22fffdba --- /dev/null +++ b/Source/shared/valve/items.h @@ -0,0 +1,23 @@ + +/* These are stored in the bitflag field */ +enumflags +{ + ITEM_CROWBAR, + ITEM_GLOCK, + ITEM_PYTHON, + ITEM_MP5, + ITEM_CROSSBOW, + ITEM_SHOTGUN, + ITEM_RPG, + ITEM_GAUSS, + ITEM_EGON, + ITEM_HORNETGUN, + ITEM_HANDGRENADE, + ITEM_TRIPMINE, + ITEM_SATCHEL, + ITEM_SNARK, + ITEM_SUIT, + ITEM_LONGJUMP, + ITEM_HEALTHKIT, + ITEM_BATTERY +}; diff --git a/Source/shared/valve/player.cpp b/Source/shared/valve/player.cpp new file mode 100644 index 00000000..b01acff5 --- /dev/null +++ b/Source/shared/valve/player.cpp @@ -0,0 +1,54 @@ + +class player +{ + float health; + float armor; + + float w_attack_next; /* When the weapon is done firing */ + float w_idle_next; /* When to play the next idle animation */ + + int a_ammo1; // Magazine/Clip + int a_ammo2; // Rest in the inventory + int a_ammo3; // Special ammo + + float items; + float activeweapon; + float viewzoom; + vector view_ofs; + + /* Weapon specific */ + int glock_mag; + +#ifdef CSQC + /* External model */ + entity p_model; + int p_hand_bone; + int p_model_bone; + float pitch; + float lastweapon; + + /* Prediction */ + vector netorigin; + vector netvelocity; + float netflags; + float net_w_attack_next; /* When the weapon is done firing */ + float net_w_idle_next; /* When to play the next idle animation */ + + virtual void() gun_offset; + virtual void() draw; + virtual float() predraw; +#else + int ammo_9mm; + int ammo_357; + int ammo_buckshot; + int ammo_m203_grenade; + int ammo_bolt; + int ammo_rocket; + int ammo_uranium; + int ammo_handgrenade; + int ammo_satchel; + int ammo_tripmine; + int ammo_snark; + int ammo_hornet; +#endif +}; diff --git a/Source/shared/valve/w_crossbow.c b/Source/shared/valve/w_crossbow.c new file mode 100644 index 00000000..0519c401 --- /dev/null +++ b/Source/shared/valve/w_crossbow.c @@ -0,0 +1,181 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + CROSSBOW_IDLE1, + CROSSBOW_IDLE2, + CROSSBOW_FIDGET1, + CROSSBOW_FIDGET2, + CROSSBOW_FIRE1, + CROSSBOW_FIRE2, + CROSSBOW_FIRE3, + CROSSBOW_RELOAD, + CROSSBOW_DRAW1, + CROSSBOW_DRAW2, + CROSSBOW_HOLSTER1, + CROSSBOW_HOLSTER2 +}; + +void w_crossbow_precache(void) +{ + precache_model("models/v_crossbow.mdl"); + precache_model("models/w_crossbow.mdl"); + precache_model("models/p_crossbow.mdl"); + precache_sound("weapons/xbow_reload1.wav"); + precache_sound("weapons/xbow_fire1.wav"); +} +string w_crossbow_vmodel(void) +{ + return "models/v_crossbow.mdl"; +} +string w_crossbow_wmodel(void) +{ + return "models/w_crossbow.mdl"; +} +string w_crossbow_pmodel(void) +{ + return "models/p_crossbow.mdl"; +} +string w_crossbow_deathmsg(void) +{ + return ""; +} + +void w_crossbow_draw(void) +{ + if (1/* has clip*/) { + Weapons_ViewAnimation(CROSSBOW_DRAW1); + } else { + Weapons_ViewAnimation(CROSSBOW_DRAW2); + } +} + +void w_crossbow_holster(void) +{ + if (1/* has clip*/) { + Weapons_ViewAnimation(CROSSBOW_HOLSTER1); + } else { + Weapons_ViewAnimation(CROSSBOW_HOLSTER2); + } +} +void w_crossbow_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + if (1/* has clip*/) { + Weapons_ViewAnimation(CROSSBOW_FIRE1); + Weapons_PlaySound(pl, CHAN_ITEM, "weapons/xbow_reload1.wav", 1, ATTN_NORM); + } else { + Weapons_ViewAnimation(CROSSBOW_FIRE3); + } + + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/xbow_fire1.wav", 1, ATTN_NORM); + Weapons_ViewPunchAngle([-2,0,0]); + pl.w_attack_next = Math_Time() + 0.75f; + pl.w_idle_next = Math_Time() + 10.0f; +} +void w_crossbow_secondary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + /* Simple toggle of fovs */ + if (pl.viewzoom == 1.0f) { + pl.viewzoom = 0.2; + } else { + pl.viewzoom = 1.0f; + } + pl.w_attack_next = Math_Time() + 0.5f; +} +void w_crossbow_reload(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + Weapons_PlaySound(pl, CHAN_ITEM, "weapons/xbow_reload1.wav", 1, ATTN_NORM); + Weapons_ViewAnimation(CROSSBOW_RELOAD); + pl.w_attack_next = Math_Time() + 4.5f; + pl.w_idle_next = Math_Time() + 10.0f; +} +void w_crossbow_release(void) +{ + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + if (random() < 0.75) { + if (1/* has clip*/) { + Weapons_ViewAnimation(CROSSBOW_IDLE1); + } else { + Weapons_ViewAnimation(CROSSBOW_IDLE2); + } + pl.w_idle_next = Math_Time() + 10.0f; + } else { + if (1/* has clip*/) { + Weapons_ViewAnimation(CROSSBOW_FIDGET1); + } else { + Weapons_ViewAnimation(CROSSBOW_FIDGET2); + } + pl.w_idle_next = Math_Time() + 3.0f; + } +} +void w_crossbow_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [72/128,0], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_crossbow_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud5.spr_0.tga", [0,0], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud2.spr_0.tga", [0,0], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_crossbow = +{ + ITEM_CROSSBOW, + 2, + 2, + w_crossbow_draw, + w_crossbow_holster, + w_crossbow_primary, + w_crossbow_secondary, + w_crossbow_reload, + w_crossbow_release, + w_crossbow_crosshair, + w_crossbow_precache, + __NULL__, + w_crossbow_vmodel, + w_crossbow_wmodel, + w_crossbow_pmodel, + w_crossbow_deathmsg, + w_crossbow_hudpic +}; + +#ifdef SSQC +void weapon_crossbow(void) { + Weapons_InitItem(WEAPON_CROSSBOW); +} +#endif + diff --git a/Source/shared/valve/w_crowbar.c b/Source/shared/valve/w_crowbar.c new file mode 100644 index 00000000..23cc63d6 --- /dev/null +++ b/Source/shared/valve/w_crowbar.c @@ -0,0 +1,173 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + CROWBAR_IDLE, + CROWBAR_DRAW, + CROWBAR_HOLSTER, + CROWBAR_ATTACK1HIT, + CROWBAR_ATTACK1MISS, + CROWBAR_ATTACK2MISS, + CROWBAR_ATTACK2HIT, + CROWBAR_ATTACK3MISS, + CROWBAR_ATTACK3HIT +}; + +void w_crowbar_precache(void) +{ + precache_sound("weapons/cbar_miss1.wav"); + precache_sound("weapons/cbar_hit1.wav"); + precache_sound("weapons/cbar_hit2.wav"); + precache_model("models/v_crowbar.mdl"); + precache_model("models/w_crowbar.mdl"); + precache_model("models/p_crowbar.mdl"); +} + +string w_crowbar_vmodel(void) +{ + return "models/v_crowbar.mdl"; +} +string w_crowbar_wmodel(void) +{ + return "models/w_crowbar.mdl"; +} +string w_crowbar_pmodel(void) +{ + return "models/p_crowbar.mdl"; +} +string w_crowbar_deathmsg(void) +{ + return "%s was assaulted by %s's Crowbar."; +} + +void w_crowbar_draw(void) +{ +#ifdef CSQC + Weapons_ViewAnimation(CROWBAR_DRAW); +#else + player pl = (player)self; + Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); +#endif +} + +void w_crowbar_holster(void) +{ +#ifdef CSQC + Weapons_ViewAnimation(CROWBAR_HOLSTER); +#endif +} +void w_crowbar_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next) { + return; + } + +#ifdef CSQC + Weapons_MakeVectors(); + vector src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(trace_fraction >= 1 ? CROWBAR_ATTACK1MISS:CROWBAR_ATTACK1HIT); + break; + case 1: + Weapons_ViewAnimation(trace_fraction >= 1 ? CROWBAR_ATTACK2MISS:CROWBAR_ATTACK2HIT); + break; + default: + Weapons_ViewAnimation(trace_fraction >= 1 ? CROWBAR_ATTACK3MISS:CROWBAR_ATTACK3HIT); + } + + if (trace_fraction >= 1.0) { + pl.w_attack_next = 0.5f; + } else { + Weapons_PlaceDecal(); + pl.w_attack_next = 0.25f; + } +#else + Weapons_MakeVectors(); + vector src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 32), FALSE, pl); + + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM); + + if (trace_fraction >= 1.0) { + pl.w_attack_next = 0.5f; + } else { + if (random() < 0.5) { + Weapons_PlaySound(pl, 8, "weapons/cbar_hit1.wav", 1, ATTN_NORM); + } else { + Weapons_PlaySound(pl, 8, "weapons/cbar_hit2.wav", 1, ATTN_NORM); + } + pl.w_attack_next = 0.25f; + } +#endif + pl.w_idle_next = 2.5f; +} +void w_crowbar_secondary(void) +{ + +} +void w_crowbar_reload(void) +{ + +} +void w_crowbar_release(void) +{ +#ifdef CSQC + player pl = (player)self; + if (pl.w_idle_next) { + return; + } + + Weapons_ViewAnimation(CROWBAR_IDLE); + pl.w_idle_next = 15.0f; +#endif +} + +void w_crowbar_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud4.spr_0.tga", [0,0], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud1.spr_0.tga", [0,0], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_crowbar = +{ + ITEM_CROWBAR, + 0, + 0, + w_crowbar_draw, + w_crowbar_holster, + w_crowbar_primary, + w_crowbar_secondary, + w_crowbar_reload, + w_crowbar_release, + __NULL__, + w_crowbar_precache, + __NULL__, + w_crowbar_vmodel, + w_crowbar_wmodel, + w_crowbar_pmodel, + w_crowbar_deathmsg, + w_crowbar_hudpic +}; + +#ifdef SSQC +void weapon_crowbar(void) { + Weapons_InitItem(WEAPON_CROWBAR); +} +#endif diff --git a/Source/shared/valve/w_egon.c b/Source/shared/valve/w_egon.c new file mode 100644 index 00000000..d39d9c7a --- /dev/null +++ b/Source/shared/valve/w_egon.c @@ -0,0 +1,117 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + EGON_IDLE1, + EGON_FIDGET1, + EGON_ALTFIREON, + EGON_ALTFIRECYCLE, + EGON_ALTFIREOFF, + EGON_FIRE1, + EGON_FIRE2, + EGON_FIRE3, + EGON_FIRE4, + EGON_DRAW, + EGON_HOLSTER +}; + +void w_egon_precache(void) +{ + precache_model("models/v_egon.mdl"); + precache_model("models/w_egon.mdl"); + precache_model("models/p_egon.mdl"); +} +string w_egon_vmodel(void) +{ + return "models/v_egon.mdl"; +} +string w_egon_wmodel(void) +{ + return "models/w_egon.mdl"; +} +string w_egon_pmodel(void) +{ + return "models/p_egon.mdl"; +} +string w_egon_deathmsg(void) +{ + return ""; +} + +void w_egon_draw(void) +{ + Weapons_ViewAnimation(EGON_DRAW); +} + +void w_egon_holster(void) +{ + Weapons_ViewAnimation(EGON_HOLSTER); +} +void w_egon_primary(void) +{ + +} +void w_egon_secondary(void) +{ + +} +void w_egon_reload(void) +{ + +} +void w_egon_release(void) +{ + +} +void w_egon_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [72/128,48/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_egon_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud5.spr_0.tga", [0,135/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud2.spr_0.tga", [0,135/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_egon = +{ + ITEM_EGON, + 3, + 2, + w_egon_draw, + w_egon_holster, + w_egon_primary, + w_egon_secondary, + w_egon_reload, + w_egon_release, + w_egon_crosshair, + w_egon_precache, + __NULL__, + w_egon_vmodel, + w_egon_wmodel, + w_egon_pmodel, + w_egon_deathmsg, + w_egon_hudpic +}; + +#ifdef SSQC +void weapon_egon(void) { + Weapons_InitItem(WEAPON_EGON); +} +#endif diff --git a/Source/shared/valve/w_gauss.c b/Source/shared/valve/w_gauss.c new file mode 100644 index 00000000..aed939d7 --- /dev/null +++ b/Source/shared/valve/w_gauss.c @@ -0,0 +1,146 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + GAUSS_IDLE1, + GAUSS_IDLE2, + GAUSS_FIDGET, + GAUSS_SPINUP, + GAUSS_SPIN, + GAUSS_FIRE1, + GAUSS_FIRE2, + GAUSS_HOLSTER, + GAUSS_DRAW +}; + +void w_gauss_precache(void) +{ + precache_model("models/v_gauss.mdl"); + precache_model("models/w_gauss.mdl"); + precache_model("models/p_gauss.mdl"); +} +string w_gauss_vmodel(void) +{ + return "models/v_gauss.mdl"; +} +string w_gauss_wmodel(void) +{ + return "models/w_gauss.mdl"; +} +string w_gauss_pmodel(void) +{ + return "models/p_gauss.mdl"; +} +string w_gauss_deathmsg(void) +{ + return ""; +} + +void w_gauss_draw(void) +{ + Weapons_ViewAnimation(GAUSS_DRAW); +} + +void w_gauss_holster(void) +{ + Weapons_ViewAnimation(GAUSS_HOLSTER); +} +void w_gauss_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + Weapons_ViewAnimation(GAUSS_FIRE2); + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/gauss2.wav", 1, ATTN_NORM); + + pl.w_attack_next = Math_Time() + 0.2f; + pl.w_idle_next = Math_Time() + 2.5f; +} +void w_gauss_secondary(void) +{ + +} +void w_gauss_reload(void) +{ + +} +void w_gauss_release(void) +{ + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + int r = floor(random(0,3)); + + switch (r) { + case 0: + Weapons_ViewAnimation(GAUSS_IDLE1); + pl.w_idle_next = Math_Time() + 10.0f; + break; + case 1: + Weapons_ViewAnimation(GAUSS_IDLE2); + pl.w_idle_next = Math_Time() + 10.0f; + break; + case 2: + Weapons_ViewAnimation(GAUSS_FIDGET); + pl.w_idle_next = Math_Time() + 3.0f; + break; + } + +} + +void w_gauss_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [48/128,48/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_gauss_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud5.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud2.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_gauss = +{ + ITEM_GAUSS, + 3, + 1, + w_gauss_draw, + w_gauss_holster, + w_gauss_primary, + w_gauss_secondary, + w_gauss_reload, + w_gauss_release, + w_gauss_crosshair, + w_gauss_precache, + __NULL__, + w_gauss_vmodel, + w_gauss_wmodel, + w_gauss_pmodel, + w_gauss_deathmsg, + w_gauss_hudpic +}; + +#ifdef SSQC +void weapon_gauss(void) { + Weapons_InitItem(WEAPON_GAUSS); +} +#endif diff --git a/Source/shared/valve/w_glock.c b/Source/shared/valve/w_glock.c new file mode 100644 index 00000000..41dbdea1 --- /dev/null +++ b/Source/shared/valve/w_glock.c @@ -0,0 +1,243 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + GLOCK_IDLE1, + GLOCK_IDLE2, + GLOCK_IDLE3, + GLOCK_SHOOT, + GLOCK_SHOOT_EMPTY, + GLOCK_RELOAD_EMPTY, + GLOCK_RELOAD, + GLOCK_DRAW, + GLOCK_HOLSTER +}; + +void w_glock_precache(void) +{ + precache_model("models/v_9mmhandgun.mdl"); + precache_model("models/w_9mmhandgun.mdl"); + precache_model("models/p_9mmhandgun.mdl"); + precache_sound("weapons/pl_gun3.wav"); +} +string w_glock_vmodel(void) +{ + return "models/v_9mmhandgun.mdl"; +} +string w_glock_wmodel(void) +{ + return "models/w_9mmhandgun.mdl"; +} +string w_glock_pmodel(void) +{ + return "models/p_9mmhandgun.mdl"; +} +string w_glock_deathmsg(void) +{ + return ""; +} + +void w_glock_pickup(void) +{ +#ifdef SSQC + player pl = (player)self; + pl.glock_mag = bound(0, pl.glock_mag + 18, 18); +#endif +} + +void w_glock_draw(void) +{ +#ifdef SSQC + player pl = (player)self; + Weapons_ViewAnimation(GLOCK_DRAW); + Weapons_UpdateAmmo(pl, pl.glock_mag, pl.ammo_9mm, __NULL__); +#endif +} +void w_glock_holster(void) +{ +#ifdef SSQC + Weapons_ViewAnimation(GLOCK_HOLSTER); +#endif +} +void w_glock_primary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0.0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + if (pl.a_ammo1) { + Weapons_ViewAnimation(GLOCK_SHOOT); + } else { + Weapons_ViewAnimation(GLOCK_SHOOT_EMPTY); + } + + Weapons_ViewPunchAngle([-2,0,0]); +#else + if (!pl.glock_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs); + + pl.glock_mag--; + + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/pl_gun3.wav", 1, ATTN_NORM); + Weapons_UpdateAmmo(pl, pl.glock_mag, pl.ammo_9mm, __NULL__); +#endif + + pl.w_attack_next = 0.3f; + pl.w_idle_next = 5.0f; +} +void w_glock_secondary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next > 0) { + return; + } + +#ifdef CSQC + if (!pl.a_ammo1) { + return; + } + + if (pl.a_ammo1) { + Weapons_ViewAnimation(GLOCK_SHOOT); + } else { + Weapons_ViewAnimation(GLOCK_SHOOT_EMPTY); + } + + Weapons_ViewPunchAngle([-2,0,0]); +#else + if (!pl.glock_mag) { + return; + } + + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs); + + pl.glock_mag--; + + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/pl_gun3.wav", 1, ATTN_NORM); + Weapons_UpdateAmmo(pl, pl.glock_mag, pl.ammo_9mm, __NULL__); +#endif + + pl.w_attack_next = 0.2f; + pl.w_idle_next = 5.0f; +} +void w_glock_reload(void) +{ + player pl = (player)self; + if (pl.w_attack_next > 0) { + return; + } +#ifdef CSQC + if (pl.a_ammo1 >= 18) { + return; + } + + if (pl.a_ammo1) { + Weapons_ViewAnimation(GLOCK_RELOAD); + } else { + Weapons_ViewAnimation(GLOCK_RELOAD_EMPTY); + } +#else + if (pl.glock_mag >= 18) { + return; + } + if (!pl.ammo_9mm) { + return; + } + + Weapons_ReloadWeapon(pl, player::glock_mag, player::ammo_9mm, 18); + Weapons_UpdateAmmo(pl, pl.glock_mag, pl.ammo_9mm, __NULL__); +#endif + + pl.w_attack_next = 2.0f; + pl.w_idle_next = 10.0f; +} +void w_glock_release(void) +{ +#ifdef CSQC + player pl = (player)self; + if (pl.w_idle_next > 0) { + return; + } + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(GLOCK_IDLE1); + break; + case 1: + Weapons_ViewAnimation(GLOCK_IDLE2); + break; + case 2: + Weapons_ViewAnimation(GLOCK_IDLE3); + break; + } + pl.w_idle_next = Math_Time() + 10.0f; +#endif +} +void w_glock_hud(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [0.1875,0], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); + HUD_DrawAmmo1(); + HUD_DrawAmmo2(); +#endif +} +void w_glock_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud4.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud1.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_glock = +{ + ITEM_GLOCK, + 1, + 0, + w_glock_draw, + w_glock_holster, + w_glock_primary, + w_glock_secondary, + w_glock_reload, + w_glock_release, + w_glock_hud, + w_glock_precache, + w_glock_pickup, + w_glock_vmodel, + w_glock_wmodel, + w_glock_pmodel, + w_glock_deathmsg, + w_glock_hudpic +}; + +#ifdef SSQC +void weapon_9mmhandgun(void) { + Weapons_InitItem(WEAPON_GLOCK); +} +void weapon_glock(void) { + Weapons_InitItem(WEAPON_GLOCK); +} +#endif diff --git a/Source/shared/valve/w_handgrenade.c b/Source/shared/valve/w_handgrenade.c new file mode 100644 index 00000000..c0a5655c --- /dev/null +++ b/Source/shared/valve/w_handgrenade.c @@ -0,0 +1,105 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + HANDGRENADE_IDLE, + HANDGRENADE_FIDGET, + HANDGRENADE_PULLPIN, + HANDGRENADE_THROW1, + HANDGRENADE_THROW2, + HANDGRENADE_THROW3, + HANDGRENADE_HOLSTER, + HANDGRENADE_DRAW +}; + +void w_handgrenade_precache(void) +{ + precache_model("models/v_grenade.mdl"); + precache_model("models/w_grenade.mdl"); + precache_model("models/p_grenade.mdl"); +} +string w_handgrenade_vmodel(void) +{ + return "models/v_grenade.mdl"; +} +string w_handgrenade_wmodel(void) +{ + return "models/w_grenade.mdl"; +} +string w_handgrenade_pmodel(void) +{ + return "models/p_grenade.mdl"; +} +string w_handgrenade_deathmsg(void) +{ + return ""; +} + +void w_handgrenade_draw(void) +{ + Weapons_ViewAnimation(HANDGRENADE_DRAW); +} + +void w_handgrenade_holster(void) +{ + +} +void w_handgrenade_primary(void) +{ + +} +void w_handgrenade_secondary(void) +{ + +} +void w_handgrenade_reload(void) +{ + +} +void w_handgrenade_release(void) +{ + +} +void w_handgrenade_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud6.spr_0.tga", [0,0], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud3.spr_0.tga", [0,0], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_handgrenade = +{ + ITEM_HANDGRENADE, + 4, + 0, + w_handgrenade_draw, + w_handgrenade_holster, + w_handgrenade_primary, + w_handgrenade_secondary, + w_handgrenade_reload, + w_handgrenade_release, + __NULL__, + w_handgrenade_precache, + __NULL__, + w_handgrenade_vmodel, + w_handgrenade_wmodel, + w_handgrenade_pmodel, + w_handgrenade_deathmsg, + w_handgrenade_hudpic +}; + +#ifdef SSQC +void weapon_handgrenade(void) { + Weapons_InitItem(WEAPON_HANDGRENADE); +} +#endif diff --git a/Source/shared/valve/w_hornetgun.c b/Source/shared/valve/w_hornetgun.c new file mode 100644 index 00000000..ac3ea43c --- /dev/null +++ b/Source/shared/valve/w_hornetgun.c @@ -0,0 +1,159 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + HORNETGUN_IDLE, + HORNETGUN_FIDGET1, + HORNETGUN_FIDGET2, + HORNETGUN_HOLSTER, + HORNETGUN_DRAW, + HORNETGUN_SHOOT +}; + +void w_hornetgun_precache(void) +{ + precache_model("models/v_hgun.mdl"); + precache_model("models/w_hgun.mdl"); + precache_model("models/p_hgun.mdl"); + + precache_sound("agrunt/ag_fire1.wav"); + precache_sound("agrunt/ag_fire2.wav"); + precache_sound("agrunt/ag_fire3.wav"); +} +void w_hornetgun_pickup(void) +{ +#ifdef SSQC + player pl = (player)self; + pl.ammo_hornet = 8; +#endif +} +string w_hornetgun_vmodel(void) +{ + return "models/v_hgun.mdl"; +} +string w_hornetgun_wmodel(void) +{ + return "models/w_hgun.mdl"; +} +string w_hornetgun_pmodel(void) +{ + return "models/p_hgun.mdl"; +} +string w_hornetgun_deathmsg(void) +{ + return ""; +} + +void w_hornetgun_draw(void) +{ + Weapons_ViewAnimation(HORNETGUN_DRAW); +} +void w_hornetgun_holster(void) +{ + +} +void w_hornetgun_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + Weapons_PlaySound(pl, CHAN_WEAPON, sprintf("agrunt/ag_fire%d.wav", floor(random(1,4))), 1, ATTN_NORM); + Weapons_ViewAnimation(HORNETGUN_SHOOT); + pl.w_attack_next = Math_Time() + 0.25; + pl.w_idle_next = Math_Time() + 2.5f; +} +void w_hornetgun_secondary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + Weapons_PlaySound(pl, CHAN_WEAPON, sprintf("agrunt/ag_fire%d.wav", floor(random(1,4))), 1, ATTN_NORM); + Weapons_ViewAnimation(HORNETGUN_SHOOT); + pl.w_attack_next = Math_Time() + 0.1; + pl.w_idle_next = Math_Time() + 2.5f; +} +void w_hornetgun_reload(void) +{ + +} +void w_hornetgun_release(void) +{ + int r; + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + r = floor(random(0,3)); + + switch (r) { + case 0: + Weapons_ViewAnimation(HORNETGUN_IDLE); + pl.w_idle_next = Math_Time() + 0.95f; + break; + case 1: + Weapons_ViewAnimation(HORNETGUN_FIDGET1); + pl.w_idle_next = Math_Time() + 2.5f; + break; + default: + Weapons_ViewAnimation(HORNETGUN_FIDGET2); + pl.w_idle_next = Math_Time() + 2.2f; + break; + } +} +void w_hornetgun_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [72/128,24/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_hornetgun_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud5.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud2.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_hornetgun = +{ + ITEM_HORNETGUN, + 3, + 3, + w_hornetgun_draw, + w_hornetgun_holster, + w_hornetgun_primary, + w_hornetgun_secondary, + w_hornetgun_reload, + w_hornetgun_release, + w_hornetgun_crosshair, + w_hornetgun_precache, + w_hornetgun_pickup, + w_hornetgun_vmodel, + w_hornetgun_wmodel, + w_hornetgun_pmodel, + w_hornetgun_deathmsg, + w_hornetgun_hudpic +}; + +#ifdef SSQC +void weapon_hornetgun(void) { + Weapons_InitItem(WEAPON_HORNETGUN); +} +#endif diff --git a/Source/shared/valve/w_mp5.c b/Source/shared/valve/w_mp5.c new file mode 100644 index 00000000..75647746 --- /dev/null +++ b/Source/shared/valve/w_mp5.c @@ -0,0 +1,190 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +.int mp5_mag; + +enum +{ + MP5_IDLE1, + MP5_IDLE2, + MP5_GRENADE, + MP5_RELOAD, + MP5_DRAW, + MP5_FIRE1, + MP5_FIRE2, + MP5_FIRE3 +}; + +void w_mp5_precache(void) +{ + precache_model("models/v_9mmar.mdl"); + precache_model("models/w_9mmar.mdl"); + precache_model("models/p_9mmar.mdl"); + precache_sound("weapons/hks1.wav"); + precache_sound("weapons/hks2.wav"); + precache_sound("weapons/glauncher.wav"); +} +void w_mp5_pickup(void) +{ + player pl = (player)self; + pl.mp5_mag = 25; +} +string w_mp5_vmodel(void) +{ + return "models/v_9mmar.mdl"; +} +string w_mp5_wmodel(void) +{ + return "models/w_9mmar.mdl"; +} +string w_mp5_pmodel(void) +{ + return "models/p_9mmar.mdl"; +} +string w_mp5_deathmsg(void) +{ + return ""; +} + +void w_mp5_draw(void) +{ + Weapons_ViewAnimation(MP5_DRAW); +} +void w_mp5_holster(void) +{ + Weapons_ViewAnimation(MP5_DRAW); +} +void w_mp5_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next) { + return; + } + +#ifdef CSQC + if (random() < 0.5) { + Weapons_ViewAnimation(MP5_FIRE1); + } else { + Weapons_ViewAnimation(MP5_FIRE2); + } + + Weapons_ViewPunchAngle([random(-2, 2),0,0]); +#else + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs); + + if (random() < 0.5) { + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/hks1.wav", 1, ATTN_NORM); + } else { + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/hks2.wav", 1, ATTN_NORM); + } +#endif + + pl.w_attack_next = 0.1f; + pl.w_idle_next = 10.0f; +} +void w_mp5_secondary(void) +{ + player pl = (player)self; + + if (pl.w_attack_next) { + return; + } + +#ifdef CSQC + Weapons_ViewAnimation(MP5_GRENADE); + Weapons_ViewPunchAngle([-10,0,0]); +#else + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/glauncher.wav", 1, ATTN_NORM); +#endif + + pl.w_attack_next = 1.0f; + pl.w_idle_next = 10.0f; +} +void w_mp5_reload(void) +{ + player pl = (player)self; + if (pl.w_attack_next) { + return; + } + +#ifdef CSQC + Weapons_ViewAnimation(MP5_RELOAD); +#else + +#endif + + pl.w_attack_next = 1.5f; + pl.w_idle_next = 10.0f; +} +void w_mp5_release(void) +{ +#ifdef CSQC + player pl = (player)self; + if (pl.w_idle_next) { + return; + } + + if (random() < 0.5) { + Weapons_ViewAnimation(MP5_IDLE1); + } else { + Weapons_ViewAnimation(MP5_IDLE2); + } + + pl.w_idle_next = 15.0f; +#endif +} +void w_mp5_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [24/128,48/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_mp5_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud4.spr_0.tga", [0,135/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud1.spr_0.tga", [0,135/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_mp5 = +{ + ITEM_MP5, + 2, + 0, + w_mp5_draw, + w_mp5_holster, + w_mp5_primary, + w_mp5_secondary, + w_mp5_reload, + w_mp5_release, + w_mp5_crosshair, + w_mp5_precache, + w_mp5_pickup, + w_mp5_vmodel, + w_mp5_wmodel, + w_mp5_pmodel, + w_mp5_deathmsg, + w_mp5_hudpic +}; + +#ifdef SSQC +void weapon_9mmAR(void) { + Weapons_InitItem(WEAPON_MP5); +} +void weapon_mp5(void) { + Weapons_InitItem(WEAPON_MP5); +} +#endif + diff --git a/Source/shared/valve/w_python.c b/Source/shared/valve/w_python.c new file mode 100644 index 00000000..c419c1d5 --- /dev/null +++ b/Source/shared/valve/w_python.c @@ -0,0 +1,182 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +.int python_cylinder; + +enum +{ + PYTHON_IDLE1, + PYTHON_FIDGET, + PYTHON_FIRE1, + PYTHON_RELOAD, + PYTHON_HOLSTER, + PYTHON_DRAW, + PYTHON_IDLE2, + PYTHON_IDLE3 +}; + +void w_python_precache(void) +{ + precache_model("models/v_357.mdl"); + precache_model("models/w_357.mdl"); + precache_model("models/p_357.mdl"); + + precache_sound("weapons/357_shot1.wav"); + precache_sound("weapons/357_shot2.wav"); +} +void w_python_pickup(void) +{ + player pl = (player)self; + pl.python_cylinder = 6; +} + +string w_python_vmodel(void) +{ + return "models/v_357.mdl"; +} +string w_python_wmodel(void) +{ + return "models/w_357.mdl"; +} +string w_python_pmodel(void) +{ + return "models/p_357.mdl"; +} +string w_python_deathmsg(void) +{ + return ""; +} + +void w_python_draw(void) +{ + Weapons_ViewAnimation(PYTHON_DRAW); +} + +void w_python_holster(void) +{ + Weapons_ViewAnimation(PYTHON_HOLSTER); +} +void w_python_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + +#ifdef SSQC + TraceAttack_FireBullets(1, pl.origin + pl.view_ofs); +#endif + + Weapons_ViewAnimation(PYTHON_FIRE1); + Weapons_ViewPunchAngle([-10,0,0]); + + if (random() < 0.5) { + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/357_shot1.wav", 1, ATTN_NORM); + } else { + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/357_shot2.wav", 1, ATTN_NORM); + } + + pl.w_attack_next = Math_Time() + 0.75f; + pl.w_idle_next = Math_Time() + 10.0f; +} +void w_python_secondary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + /* Simple toggle of fovs */ + if (pl.viewzoom == 1.0f) { + pl.viewzoom = 0.5; + } else { + pl.viewzoom = 1.0f; + } + pl.w_attack_next = Math_Time() + 0.5f; +} +void w_python_reload(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + Weapons_ViewAnimation(PYTHON_RELOAD); + pl.w_attack_next = Math_Time() + 3.25f; + pl.w_idle_next = Math_Time() + 10.0f; +} +void w_python_release(void) +{ + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + int r = floor(random(0,3)); + + switch (r) { + case 0: + Weapons_ViewAnimation(PYTHON_IDLE1); + break; + case 1: + Weapons_ViewAnimation(PYTHON_IDLE2); + break; + case 2: + Weapons_ViewAnimation(PYTHON_IDLE3); + break; + } + + pl.w_idle_next = Math_Time() + 15.0f; +} +void w_python_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [48/128,0], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_python_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud4.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud1.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_python = +{ + ITEM_PYTHON, + 1, + 1, + w_python_draw, + w_python_holster, + w_python_primary, + w_python_secondary, + w_python_reload, + w_python_release, + w_python_crosshair, + w_python_precache, + w_python_pickup, + w_python_vmodel, + w_python_wmodel, + w_python_pmodel, + w_python_deathmsg, + w_python_hudpic +}; + +#ifdef SSQC +void weapon_357(void) { + Weapons_InitItem(WEAPON_PYTHON); +} +void weapon_python(void) { + Weapons_InitItem(WEAPON_PYTHON); +} +#endif diff --git a/Source/shared/valve/w_rpg.c b/Source/shared/valve/w_rpg.c new file mode 100644 index 00000000..9d1a1745 --- /dev/null +++ b/Source/shared/valve/w_rpg.c @@ -0,0 +1,121 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + RPG_IDLE, + RPG_FIDGET, + RPG_RELOAD, + RPG_FIRE2, + RPG_HOLSTER1, + RPG_DRAW1, + RPG_HOLSTER2, + RPG_DRAW_UL, + RPG_IDLE_UL, + RPG_FIDGET_UL, +}; + +void w_rpg_precache(void) +{ + precache_model("models/v_rpg.mdl"); + precache_model("models/w_rpg.mdl"); + precache_model("models/p_rpg.mdl"); +} +string w_rpg_vmodel(void) +{ + return "models/v_rpg.mdl"; +} +string w_rpg_wmodel(void) +{ + return "models/w_rpg.mdl"; +} +string w_rpg_pmodel(void) +{ + return "models/p_rpg.mdl"; +} +string w_rpg_deathmsg(void) +{ + return ""; +} + +void w_rpg_draw(void) +{ + Weapons_ViewAnimation(RPG_DRAW1); +} + +void w_rpg_holster(void) +{ + +} +void w_rpg_primary(void) +{ + +} +void w_rpg_secondary(void) +{ + +} +void w_rpg_reload(void) +{ + +} +void w_rpg_release(void) +{ + +} + +void w_rpg_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud5.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud2.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +void w_rpg_laser(void) +{ + player pl = (player)self; + + Weapons_MakeVectors(); + vector src = pl.origin + pl.view_ofs; + traceline(src, src + (v_forward * 8192), FALSE, pl); +#ifdef CSQC + // Draw laser at laserpos +#endif +} + +weapon_t w_rpg = +{ + ITEM_RPG, + 3, + 0, + w_rpg_draw, + w_rpg_holster, + w_rpg_primary, + w_rpg_secondary, + w_rpg_reload, + w_rpg_release, + w_rpg_laser, + w_rpg_precache, + __NULL__, + w_rpg_vmodel, + w_rpg_wmodel, + w_rpg_pmodel, + w_rpg_deathmsg, + w_rpg_hudpic +}; + +#ifdef SSQC +void weapon_rpg(void) { + Weapons_InitItem(WEAPON_RPG); +} +#endif + diff --git a/Source/shared/valve/w_satchel.c b/Source/shared/valve/w_satchel.c new file mode 100644 index 00000000..7ee2ddfc --- /dev/null +++ b/Source/shared/valve/w_satchel.c @@ -0,0 +1,109 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + SATCHEL_IDLE, + SATCHEL_FIDGET, + SATCHEL_DRAW, + SATCHEL_THROW +}; + +enum +{ + RADIO_IDLE, + RADIO_FIDGET, + RADIO_DRAW, + RADIO_USE, + RADIO_HOLSTER +}; + +void w_satchel_draw(void) +{ + Weapons_ViewAnimation(SATCHEL_DRAW); +} + +void w_satchel_holster(void) +{ + +} +void w_satchel_primary(void) +{ + +} +void w_satchel_secondary(void) +{ + +} +void w_satchel_reload(void) +{ + +} +void w_satchel_release(void) +{ + +} +void w_satchel_precache(void) +{ + +} +string w_satchel_vmodel(void) +{ + return "models/v_satchel.mdl"; +} +string w_satchel_wmodel(void) +{ + return "models/w_satchel.mdl"; +} +string w_satchel_pmodel(void) +{ + return "models/p_satchel.mdl"; +} +string w_satchel_deathmsg(void) +{ + return ""; +} + +void w_satchel_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud6.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud3.spr_0.tga", [0,45/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + + +weapon_t w_satchel = +{ + ITEM_SATCHEL, + 4, + 1, + w_satchel_draw, + w_satchel_holster, + w_satchel_primary, + w_satchel_secondary, + w_satchel_reload, + w_satchel_release, + __NULL__, + w_satchel_precache, + __NULL__, + w_satchel_vmodel, + w_satchel_wmodel, + w_satchel_pmodel, + w_satchel_deathmsg, + w_satchel_hudpic +}; + +#ifdef SSQC +void weapon_satchel(void) { + Weapons_InitItem(WEAPON_SATCHEL); +} +#endif diff --git a/Source/shared/valve/w_shotgun.c b/Source/shared/valve/w_shotgun.c new file mode 100644 index 00000000..5fcf4c3e --- /dev/null +++ b/Source/shared/valve/w_shotgun.c @@ -0,0 +1,154 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + SHOTGUN_IDLE1, + SHOTGUN_FIRE1, + SHOTGUN_FIRE2, + SHOTGUN_RELOAD, + SHOTGUN_PUMP, + SHOTGUN_START_RELOAD, + SHOTGUN_DRAW, + SHOTGUN_HOLSTER, + SHOTGUN_IDLE2, + SHOTGUN_IDLE3 +}; + +void w_shotgun_precache(void) +{ + precache_model("models/v_shotgun.mdl"); + precache_model("models/w_shotgun.mdl"); + precache_model("models/p_shotgun.mdl"); + precache_sound("weapons/sbarrel1.wav"); + precache_sound("weapons/dbarrel1.wav"); +} +string w_shotgun_vmodel(void) +{ + return "models/v_shotgun.mdl"; +} +string w_shotgun_wmodel(void) +{ + return "models/w_shotgun.mdl"; +} +string w_shotgun_pmodel(void) +{ + return "models/p_shotgun.mdl"; +} +string w_shotgun_deathmsg(void) +{ + return ""; +} + +void w_shotgun_draw(void) +{ + Weapons_ViewAnimation(SHOTGUN_DRAW); +} + +void w_shotgun_holster(void) +{ + Weapons_ViewAnimation(SHOTGUN_HOLSTER); +} +void w_shotgun_primary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/sbarrel1.wav", 1, ATTN_NORM); + Weapons_ViewAnimation(SHOTGUN_FIRE1); + Weapons_ViewPunchAngle([-5,0,0]); + pl.w_attack_next = Math_Time() + 0.75; + pl.w_idle_next = Math_Time() + 2.5f; +} +void w_shotgun_secondary(void) +{ + player pl = (player)self; + if (pl.w_attack_next > Math_Time()) { + return; + } + + Weapons_PlaySound(pl, CHAN_WEAPON, "weapons/dbarrel1.wav", 1, ATTN_NORM); + Weapons_ViewAnimation(SHOTGUN_FIRE2); + Weapons_ViewPunchAngle([-10,0,0]); + pl.w_attack_next = Math_Time() + 1.5f; + pl.w_idle_next = Math_Time() + 2.5f; +} +void w_shotgun_reload(void) +{ + +} +void w_shotgun_release(void) +{ + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + int r = floor(random(0,3)); + switch (r) { + case 0: + Weapons_ViewAnimation(SHOTGUN_IDLE1); + break; + case 1: + Weapons_ViewAnimation(SHOTGUN_IDLE2); + break; + case 2: + Weapons_ViewAnimation(SHOTGUN_IDLE3); + break; + } + + pl.w_idle_next = Math_Time() + 15.0f; +} +void w_shotgun_crosshair(void) +{ +#ifdef CSQC + static vector cross_pos; + cross_pos = (video_res / 2) + [-12,-12]; + drawsubpic(cross_pos, [24,24], "sprites/crosshairs.spr_0.tga", [48/128,24/128], [0.1875, 0.1875], [1,1,1], 1, DRAWFLAG_NORMAL); +#endif +} + +void w_shotgun_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud4.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud1.spr_0.tga", [0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_shotgun = +{ + ITEM_SHOTGUN, + 2, + 1, + w_shotgun_draw, + w_shotgun_holster, + w_shotgun_primary, + w_shotgun_secondary, + w_shotgun_reload, + w_shotgun_release, + w_shotgun_crosshair, + w_shotgun_precache, + __NULL__, + w_shotgun_vmodel, + w_shotgun_wmodel, + w_shotgun_pmodel, + w_shotgun_deathmsg, + w_shotgun_hudpic +}; + +#ifdef SSQC +void weapon_shotgun(void) { + Weapons_InitItem(WEAPON_SHOTGUN); +} +#endif diff --git a/Source/shared/valve/w_snark.c b/Source/shared/valve/w_snark.c new file mode 100644 index 00000000..9401e48a --- /dev/null +++ b/Source/shared/valve/w_snark.c @@ -0,0 +1,121 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + SNARK_IDLE, + SNARK_FIDGET1, + SNARK_FIDGET2, + SNARK_HOLSTER, + SNARK_DRAW, + SNARK_THROW +}; + +void w_snark_draw(void) +{ + Weapons_ViewAnimation(SNARK_DRAW); +} + +void w_snark_holster(void) +{ + +} +void w_snark_primary(void) +{ + +} +void w_snark_secondary(void) +{ + +} +void w_snark_reload(void) +{ + +} +void w_snark_release(void) +{ + int r; + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + r = floor(random(0,3)); + + switch (r) { + case 0: + Weapons_ViewAnimation(SNARK_IDLE); + pl.w_idle_next = Math_Time() + 1.875f; + break; + case 1: + Weapons_ViewAnimation(SNARK_FIDGET1); + pl.w_idle_next = Math_Time() + 4.375f; + break; + default: + Weapons_ViewAnimation(SNARK_FIDGET2); + pl.w_idle_next = Math_Time() + 5.0f; + break; + } +} +void w_snark_precache(void) +{ + +} +string w_snark_vmodel(void) +{ + return "models/v_squeak.mdl"; +} +string w_snark_wmodel(void) +{ + return "models/w_squeak.mdl"; +} +string w_snark_pmodel(void) +{ + return "models/p_squeak.mdl"; +} +string w_snark_deathmsg(void) +{ + return ""; +} +void w_snark_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud6.spr_0.tga", [0,135/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud3.spr_0.tga", [0,135/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_snark = +{ + ITEM_SNARK, + 4, + 3, + w_snark_draw, + w_snark_holster, + w_snark_primary, + w_snark_secondary, + w_snark_reload, + w_snark_release, + __NULL__, + w_snark_precache, + __NULL__, + w_snark_vmodel, + w_snark_wmodel, + w_snark_pmodel, + w_snark_deathmsg, + w_snark_hudpic +}; + +#ifdef SSQC +void weapon_snark(void) { + Weapons_InitItem(WEAPON_SNARK); +} +#endif diff --git a/Source/shared/valve/w_tripmine.c b/Source/shared/valve/w_tripmine.c new file mode 100644 index 00000000..c7b6363b --- /dev/null +++ b/Source/shared/valve/w_tripmine.c @@ -0,0 +1,127 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +enum +{ + TRIPMINE_IDLE1, + TRIPMINE_IDLE2, + TRIPMINE_FIRE1, + TRIPMINE_FIRE2, + TRIPMINE_FIDGET, + TRIPMINE_HOLSTER, + TRIPMINE_DRAW, + TRIPMINE_WORLD, + TRIPMINE_GROUND, +}; + +void w_tripmine_precache(void) +{ + precache_model("models/v_tripmine.mdl"); + precache_model("models/w_tripmine.mdl"); + precache_model("models/p_tripmine.mdl"); +} +string w_tripmine_vmodel(void) +{ + return "models/v_tripmine.mdl"; +} +string w_tripmine_wmodel(void) +{ + return "models/w_tripmine.mdl"; +} +string w_tripmine_pmodel(void) +{ + return "models/p_tripmine.mdl"; +} +string w_tripmine_deathmsg(void) +{ + return ""; +} + +void w_tripmine_draw(void) +{ + Weapons_ViewAnimation(TRIPMINE_DRAW); +} +void w_tripmine_holster(void) +{ + +} +void w_tripmine_primary(void) +{ + +} +void w_tripmine_secondary(void) +{ + +} +void w_tripmine_reload(void) +{ + +} +void w_tripmine_release(void) +{ + int r; + player pl = (player)self; + if (pl.w_idle_next > Math_Time()) { + return; + } + + r = floor(random(0,3)); + + switch (r) { + case 0: + Weapons_ViewAnimation(TRIPMINE_IDLE1); + pl.w_idle_next = Math_Time() + 3.0f; + break; + case 1: + Weapons_ViewAnimation(TRIPMINE_IDLE2); + pl.w_idle_next = Math_Time() + 2.0f; + break; + default: + Weapons_ViewAnimation(TRIPMINE_FIDGET); + pl.w_idle_next = Math_Time() + 3.333333f; + break; + } +} + +void w_tripmine_hudpic(int s, vector pos) +{ +#ifdef CSQC + if (s) { + drawsubpic(pos, [170,45], "sprites/640hud6.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } else { + drawsubpic(pos, [170,45], "sprites/640hud3.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE); + } +#endif +} + +weapon_t w_tripmine = +{ + ITEM_TRIPMINE, + 4, + 2, + w_tripmine_draw, + w_tripmine_holster, + w_tripmine_primary, + w_tripmine_secondary, + w_tripmine_reload, + w_tripmine_release, + __NULL__, + w_tripmine_precache, + __NULL__, + w_tripmine_vmodel, + w_tripmine_wmodel, + w_tripmine_pmodel, + w_tripmine_deathmsg, + w_tripmine_hudpic +}; + +#ifdef SSQC +void weapon_tripmine(void) { + Weapons_InitItem(WEAPON_TRIPMINE); +} +#endif diff --git a/Source/shared/valve/weapons.c b/Source/shared/valve/weapons.c new file mode 100644 index 00000000..5e06e244 --- /dev/null +++ b/Source/shared/valve/weapons.c @@ -0,0 +1,300 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +#ifdef SSQC +void Decals_Init(void); +#endif + +weapon_t w_null = {}; +weapon_t g_weapons[] = { + w_null, + w_crowbar, + w_glock, + w_python, + w_mp5, + w_shotgun, + w_crossbow, + w_rpg, + w_gauss, + w_egon, + w_hornetgun, + w_handgrenade, + w_satchel, + w_tripmine, + w_snark +}; + +void Weapons_Init(void) +{ + for (int i = 0; i < g_weapons.length; i++) { + if (g_weapons[i].precache != __NULL__) { + g_weapons[i].precache(); + } + } + +#ifdef SSQC + Decals_Init(); +#endif +} + +void Weapons_Draw(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + + pl.w_attack_next = Math_Time() + 0.5f; + pl.w_idle_next = Math_Time() + 2.5f; + + if (g_weapons[i].draw != __NULL__) { + g_weapons[i].draw(); + } +} + +void Weapons_Holster(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + if (g_weapons[i].holster != __NULL__) { + g_weapons[i].holster(); + } +} + +void Weapons_Primary(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + if (g_weapons[i].primary != __NULL__) { + g_weapons[i].primary(); + } +} + +void Weapons_Secondary(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + if (g_weapons[i].secondary != __NULL__) { + g_weapons[i].secondary(); + } +} + +void Weapons_Reload(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + if (g_weapons[i].reload != __NULL__) { + g_weapons[i].reload(); + } +} + +void Weapons_Release(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + if (g_weapons[i].release != __NULL__) { + g_weapons[i].release(); + } +} + +void Weapons_DrawCrosshair(void) +{ + player pl = (player)self; + int i = pl.activeweapon; + if (g_weapons[i].crosshair != __NULL__) { + g_weapons[i].crosshair(); + } +} + +string Weapons_GetViewmodel(int id) +{ + if (g_weapons[id].vmodel != __NULL__) { + return g_weapons[id].vmodel(); + } + + return ""; +} + +string Weapons_GetWorldmodel(int id) +{ + if (g_weapons[id].wmodel != __NULL__) { + return g_weapons[id].wmodel(); + } + + return ""; +} + +string Weapons_GetPlayermodel(int id) +{ + if (g_weapons[id].pmodel != __NULL__) { + return g_weapons[id].pmodel(); + } + + return ""; +} + +string Weapons_GetDeathmessage(int id) +{ + if (g_weapons[id].deathmsg != __NULL__) { + return g_weapons[id].deathmsg(); + } + + return ""; +} + +#ifdef CSQC +void Weapons_HUDPic(int id, int s, vector pos) +{ + if (g_weapons[id].hudpic != __NULL__) { + g_weapons[id].hudpic(s, pos); + } +} +#endif + +void Weapons_MakeVectors(void) +{ +#ifdef SSQC + player pl = (player)self; + makevectors(pl.v_angle); +#else + makevectors(view_angles); +#endif +} + +void Weapons_ViewAnimation(int i) +{ +#ifdef CSQC + View_PlayAnimation(i); +#else + WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET ); + WriteByte( MSG_MULTICAST, EV_VIEWMODEL ); + WriteByte( MSG_MULTICAST, i ); + msg_entity = self; + multicast( [0,0,0], MULTICAST_ONE ); +#endif +} + +void Weapons_ViewPunchAngle(vector add) +{ +#ifdef CSQC + View_AddPunchAngle(add); + +#endif +} + +void Weapons_PlaySound(entity t, float ch, string s, float vol, float at) +{ +#ifdef SSQC + sound(t, ch, s, vol, at); +#endif +} + +#ifdef SSQC +entity g_decals; +#define DECALS_MAX 16 +void Decals_Init(void) +{ + entity nextdecal = spawn(); + g_decals = nextdecal; + for ( int i = 0; i <= DECALS_MAX; i++ ) { + nextdecal.classname = "decal"; + nextdecal.owner = spawn(); + + if ( i == DECALS_MAX ) { + nextdecal.owner = g_decals; + } else { + nextdecal = nextdecal.owner; + } + } +} + +entity Decals_Next(void) +{ + entity ret = g_decals; + g_decals = g_decals.owner; + return ret; +} +#endif + +void Weapons_PlaceDecal(void) +{ +#ifdef SSQC + entity decal = Decals_Next(); + decal.think = infodecal; + decal.texture = sprintf("{shot%d", floor(random(1,6))); + decal.nextthink = time /*+ 0.1f*/; + setorigin(decal, trace_endpos); +#endif +} +void Weapons_PlaceBigDecal(void) +{ +#ifdef SSQC + entity decal = Decals_Next(); + decal.think = infodecal; + decal.texture = sprintf("{bigshot%d", floor(random(1,6))); + decal.nextthink = time /*+ 0.1f*/; + setorigin(decal, trace_endpos); + Effect_Impact(IMPACT_DEFAULT, trace_endpos, trace_plane_normal); +#endif +} + +int Weapons_IsPresent(player pl, int w) +{ + if (pl.items & g_weapons[w].id) { + return TRUE; + } else { + return FALSE; + } +} + +#ifdef SSQC +void Weapons_AddItem(player pl, int w) +{ + entity oldself = self; + self = pl; + pl.items |= g_weapons[w].id; + pl.activeweapon = w; + + if (g_weapons[w].pickup != __NULL__) { + g_weapons[w].pickup(); + } + + Weapons_Draw(); + self = oldself; +} + +void Weapons_InitItem(int w) +{ + itemweapon it = (itemweapon)self; + spawnfunc_itemweapon(); + it.setitem(w); +} + +void Weapons_UpdateAmmo(player pl, int a1, int a2, int a3) +{ + /* Networked as bytes, since we don't need more. Clamp to avoid errors */ + pl.a_ammo1 = bound(0, a1, 255); + pl.a_ammo2 = bound(0, a2, 255); + pl.a_ammo3 = bound(0, a3, 255); +} + +void Weapons_ReloadWeapon(player pl, .int mag, .int ammo, int max) +{ + int iNeed = max - pl.(mag); + int iHave = pl.(ammo); + + if ( iNeed > iHave ) { + pl.(mag) += iHave; + pl.(ammo) = 0; + } else { + pl.(mag) += iNeed; + pl.(ammo) -= iNeed; + } +} +#endif + + + diff --git a/Source/shared/valve/weapons.h b/Source/shared/valve/weapons.h new file mode 100644 index 00000000..afd70924 --- /dev/null +++ b/Source/shared/valve/weapons.h @@ -0,0 +1,86 @@ +/*** +* +* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved. +* +* See the file LICENSE attached with the sources for usage details. +* +****/ + +typedef struct +{ + int id; /* bitflag id */ + int slot; + int slot_pos; + + void() draw; + void() holster; + void() primary; + void() secondary; + void() reload; + void() release; + void() crosshair; + + void() precache; + void() pickup; + string() vmodel; + string() wmodel; + string() pmodel; + string() deathmsg; + void(int, vector) hudpic; +} weapon_t; + +/* Weapon Indices for the weapon table */ +enum +{ + WEAPON_NONE, + WEAPON_CROWBAR, + WEAPON_GLOCK, + WEAPON_PYTHON, + WEAPON_MP5, + WEAPON_SHOTGUN, + WEAPON_CROSSBOW, + WEAPON_RPG, + WEAPON_GAUSS, + WEAPON_EGON, + WEAPON_HORNETGUN, + WEAPON_HANDGRENADE, + WEAPON_SATCHEL, + WEAPON_TRIPMINE, + WEAPON_SNARK +}; + +/* What the weapons do support and stuff */ +enum +{ + AMMO_9MM, + AMMO_357, + AMMO_BUCKSHOT, + AMMO_M203_GRENADE, + AMMO_BOLT, + AMMO_ROCKET, + AMMO_URANIUM, + AMMO_HANDGRENADE, + AMMO_SATCHEL, + AMMO_TRIPMINE, + AMMO_SNARK, + AMMO_HORNET +}; + +void Weapons_DrawCrosshair(void); +void Weapons_PlaceDecal(void); +void Weapons_PlaceBigDecal(void); +void Weapons_MakeVectors(void); +void Weapons_ViewAnimation(int i); +void Weapons_ViewPunchAngle(vector add); +void Weapons_PlaySound(entity t, float ch, string s, float vol, float at); +int Weapons_IsPresent(player pl, int w); + +#ifdef SSQC +void Weapons_InitItem(int w); +void Weapons_AddItem(player pl, int w); +string Weapons_GetWorldmodel(int id); +void Weapons_UpdateAmmo(player pl, int a1, int a2, int a3); +void Weapons_ReloadWeapon(player pl, .int mag, .int ammo, int max); +#else +void Weapons_HUDPic(int w, int s, vector pos); +#endif diff --git a/cstrike/csprogs.dat b/cstrike/csprogs.dat index f67723ec..c59cbf7b 100644 Binary files a/cstrike/csprogs.dat and b/cstrike/csprogs.dat differ diff --git a/cstrike/gfx.wad b/cstrike/gfx.wad new file mode 100644 index 00000000..8de6737e Binary files /dev/null and b/cstrike/gfx.wad differ diff --git a/cstrike/progs.dat b/cstrike/progs.dat index b07c7245..c047b712 100644 Binary files a/cstrike/progs.dat and b/cstrike/progs.dat differ diff --git a/valve/csprogs.dat b/valve/csprogs.dat index 68a5c6a4..b0daf5c3 100644 Binary files a/valve/csprogs.dat and b/valve/csprogs.dat differ diff --git a/valve/default.cfg b/valve/default.cfg new file mode 100755 index 00000000..7eda842f --- /dev/null +++ b/valve/default.cfg @@ -0,0 +1,107 @@ +bind w +forward +bind s +back +bind a +moveleft +bind d +moveright +bind "0" "slot10" +bind "1" "slot1" +bind "2" "slot2" +bind "3" "slot3" +bind "4" "slot4" +bind "5" "slot5" +bind "6" "slot6" +bind "7" "slot7" +bind "8" "slot8" +bind "9" "slot9" +bind "q" "lastinv" +bind "UPARROW" "+forward" +bind "DOWNARROW" "+back" +bind "LEFTARROW" "+left" +bind "RIGHTARROW" "+right" +bind MOUSE1 +attack +bind MOUSE2 +attack2 +bind "MWHEELDOWN" "invnext" +bind "MWHEELUP" "invprev" +bind r +reload +bind e +use +bind n nightvision +bind g drop +bind TAB +showscores +bind c radio3 +bind x radio2 +bind z radio1 +bind y messagemode +bind u messagemode2 +bind t "impulse 201" + +bind SPACE +jump +bind CTRL +duck +bind SHIFT +speed + +bind b buy +bind m chooseteam +bind ESC togglemenu + +// Game variables +seta maxplayers 8 +seta mp_startmoney "800" +seta mp_buytime 90 +seta mp_freezetime 6 +seta mp_c4timer 45 +seta mp_roundtime 5 +seta fcs_knifeonly 0 +seta fcs_swapteams 0 +seta fcs_nopickups 0 +seta fcs_reward_kill 300 +seta fcs_penalty_pain -150 +seta fcs_penalty_kill -1500 +seta fcs_maxmoney 16000 +seta fcs_fillweapons 0 +seta fcs_autoreload 0 + +// Movement Variables +seta sv_maxspeed 240 +seta cl_forwardspeed 400 +seta cl_sidespeed 400 +seta cl_backspeed 400 +seta cl_movespeedkey 0.5 +seta sv_accelerate "5" +seta pm_bunnyspeedcap "0" +seta pm_stepdown 0 + +seta cl_bob 0 +seta v_bobcycle 0.8 +seta v_bob 0.01 +seta v_bobup 0.5 +seta r_particledesc default +seta con_textsize "12" +seta con_color "255 150 0" +seta vgui_color "255 170 0" +seta cross_color "0 255 0" + +hostname "FreeCS Server" +seta vid_conautoscale "1" + +seta r_polygonoffset_submodel_offset "0" +seta r_polygonoffset_submodel_factor "0" +seta r_fullbrightSkins "0" +seta r_fb_models "0" +seta v_contentblend "0" +seta com_nogamedirnativecode "0" +seta cl_cursor_scale "1" +seta r_shadow_realtime_world_shadows "0" +seta r_shadow_realtime_dlight_shadows "0" +seta r_imageexensions "tga bmp pcx" +seta gl_blacklist_debug_glsl 0 +seta vid_conautoscale "1" +seta scr_conalpha "1" +seta scr_sshot_type "tga" +seta con_notifylines "0" +seta con_logcenterprint "0" +seta maxplayers "8" +seta lang "en_us" +seta cfg_save_auto "1" +seta r_meshpitch "1" +seta gl_overbright "0" +seta cl_idlefps "0" +seta maxpitch "89" +seta minpitch "-89" diff --git a/valve/gfx.wad b/valve/gfx.wad index 8de6737e..0a81dc80 100644 Binary files a/valve/gfx.wad and b/valve/gfx.wad differ diff --git a/valve/glsl/defaultskin.glsl b/valve/glsl/defaultskin.glsl index 7bdf99e7..9c24fe96 100644 --- a/valve/glsl/defaultskin.glsl +++ b/valve/glsl/defaultskin.glsl @@ -29,8 +29,16 @@ varying vec3 light; vec3 n, s, t, w; gl_Position = skeletaltransform_wnst(w,n,s,t); tex_c = v_texcoord; - light = e_light_ambient + ( e_light_mul * dot( n, e_light_dir ) ); - + light = e_light_ambient + (e_light_mul * dot(n, e_light_dir)); + +#ifdef CHROME + vec3 viewc = normalize(e_eyepos - v_position.xyz); + float d = dot(n, viewc); + vec3 reflected = n * 2 * d - viewc; + tex_c.x = 0.5 + reflected.y * 0.5; + tex_c.y = 0.5 - reflected.z * 0.5; +#endif + if (light.r > 1.0f) { light.r = 1.0f; } diff --git a/valve/menu.dat b/valve/menu.dat index 823a6c8e..0c8e928e 100644 Binary files a/valve/menu.dat and b/valve/menu.dat differ diff --git a/valve/particles/decal_glass.tga b/valve/particles/decal_glass.tga new file mode 100755 index 00000000..1e03f24e Binary files /dev/null and b/valve/particles/decal_glass.tga differ diff --git a/valve/particles/decal_shot.tga b/valve/particles/decal_shot.tga new file mode 100755 index 00000000..0b50589b Binary files /dev/null and b/valve/particles/decal_shot.tga differ diff --git a/valve/particles/default.cfg b/valve/particles/default.cfg new file mode 100755 index 00000000..bdb0b69d --- /dev/null +++ b/valve/particles/default.cfg @@ -0,0 +1,201 @@ +r_part part_spark +{ + type texturedspark + texture ball + tcoords 1 65 31 95 256 8 32 + scale 1 + count 4 + scalefactor 1 + alpha 0.5 + die 0.8 + rgb 255 115 0 + blend add + spawnmode ball + spawnorg 1 + spawnvel 100 + veladd 100 + friction 0.3 + gravity 800 +} + +r_part part_pieces_black +{ + type ball + texture ball + tcoords 1 65 31 95 256 8 32 + scale 2 + count 18 + scalefactor 1 + alpha 1 + die 0.8 + rgb 25 25 25 + spawnmode ball + spawnorg 1 + spawnvel 100 + veladd 100 + friction 0.3 + gravity 800 +} + +r_part part_smoke_brown +{ + texture ball + tcoords 1 65 31 95 256 8 32 + count 3 + scale 25 + scalefactor 1 + die 1 + alpha 0.5 + rgb 155 90 0 + blend add + spawnmode ball + spawnorg 2 + spawnvel 20 + veladd 20 +} + +r_part part_smoke_grey +{ + texture ball + tcoords 1 65 31 95 256 8 32 + count 3 + scale 25 + scalefactor 1 + die 1 + alpha 0.5 + rgb 25 25 25 + blend add + spawnmode ball + spawnorg 2 + spawnvel 20 + veladd 20 +} + +r_part part_blood +{ + type texturedspark + texture ball + tcoords 1 65 31 95 256 8 32 + scale 1 + count 12 + scalefactor 1 + alpha 0.2 + die 0.8 + rgb 200 0 0 + spawnmode ball + spawnorg 1 + spawnvel 100 + veladd -100 + friction 0.3 + gravity 800 +} + +r_part decal_shot +{ + type decal + blend premul_subtract + texture "particles/decal_shot" + tcoords 0 0 0.125 1 1 8 0.125 + rgbf 1 1 1 + alpha 1 + alphadelta -0.05 + scale 8 8 + scalefactor 1 + stretchfactor 1 + die 20 20 + orgwrand 6 6 6 + randomvel 0 0 0 + rotationstart -180 180 +} + +r_part decal_glass +{ + type decal + blend add + texture "particles/decal_glass" + tcoords 0 0 0.125 1 1 8 0.125 + rgbf 1 1 1 + alpha 1 + alphadelta -0.05 + scale 24 24 + scalefactor 1 + stretchfactor 1 + die 20 20 + orgwrand 6 6 6 + randomvel 0 0 0 + rotationstart -180 180 +} + +///////////////////////////////////////////////// +//rocket explosions +r_part ember +{ + count 1 + texture "particles/fteparticlefont.tga" + tcoords 97 97 191 191 256 + rgb 255 128 76 + alpha 0 + scale 15 + scalefactor 1 + friction 8 + gravity 50 + die 1 + blend add + randomvel 5 + veladd 1 + rampmode delta + ramp 0 0 0 -0.5 0 + ramp 0 0 0 0.1 0 + ramp 0 0 0 0.1 0 + ramp 0 0 0 0.1 0 + ramp 0 0 0 0.1 0 + ramp 0 0 0 0.1 0 +} + +//the bits that fly off +r_part expgib +{ + cliptype expgib + texture "particles/fteparticlefont.tga" + tcoords 97 97 191 191 256 + alpha 0 + count 16 + die 1 + randomvel 128 + gravity 50 + friction 2 + emit ember + emitinterval 0.01 + spawnmode circle +} + +//the heart of the explosion +r_part te_explosion +{ + texture "particles/fteparticlefont.tga" + tcoords 97 97 191 191 256 + count 1 + scale 200 + scalefactor 1 + die 1 + rgb 255 128 76 + rgbdelta 0 -32 -32 + friction 1 + blend add + assoc expgib +} + +r_part smokegren +{ + texture ball + count 1 + scale 512 + scalefactor 1 + die 3 + alpha 0.7 + rgb 128 128 128 + spawnmode ball + gravity -25 + veladd -20 + randomvel 64 -64 +} \ No newline at end of file diff --git a/valve/progs.dat b/valve/progs.dat index adb89b09..521089bb 100644 Binary files a/valve/progs.dat and b/valve/progs.dat differ