Index: code/game/bg_misc.c =================================================================== --- code/game/bg_misc.c (revision 537) +++ code/game/bg_misc.c (working copy) @@ -1332,6 +1332,114 @@ /* ============= + WP_BOW + ============= + */ + { + // animations + { + // WP_ANIM_CHANGE + { + 0, //firstframe + 38, //numFrames + 0, //loopFrames + 38, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_DROP + { + 83, //firstframe + (99-82), //numFrames + 0, //loopFrames + 0, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_IDLE + { + 0, //firstframe + 0, //numFrames + 0, //loopFrames + 0, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_FIRE + { + 39, //firstframe + (80-39), //numFrames + 0, //loopFrames + 40, //frameLerp + 40, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_ALT_FIRE + { + 0, //firstframe + 0, //numFrames + 0, //loopFrames + 0, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_RELOAD + { + 0, //firstframe + 0, //numFrames + 0, //loopFrames + 0, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_SPECIAL + { + 0, //firstframe + 0, //numFrames + 0, //loopFrames + 0, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + }, + // WP_ANIM_SPECIAL2 + { + 0, //firstframe + (0), //numFrames + 0, //loopFrames + 0, //frameLerp + 0, //initialLerp + 0, //reversed + 0 //flipflop + } + }, + 0, //spread + 70, //damage + 2000, //range + -7*20, //addTime + (52-42)*40, //count + -1, //clipAmmo + 0, //clip + 10, //maxAmmo + + "models/weapons2/bow/v_bow.md3", //v_model + 0, //v_barrel + "sound/weapons/dyn_throw.wav", //snd_fire + "sound/weapons/rifle_reload1.wav", //snd_reload + + "Bow", //name + "models/weapons2/bow/", //path + WPS_OTHER + }, + + /* + ============= WP_DYNAMITE ============= */ @@ -1623,8 +1731,8 @@ { "pickup_money", "sound/misc/m_pickup.wav", - { "models/items/moneybag.md3", - NULL, NULL, NULL }, + { "models/items/moneybag.md3", + NULL, NULL, NULL }, /* icon */ "hud/weapons/moneybag", 1, /* pickup */ "Money", @@ -1642,8 +1750,8 @@ { "item_money", "sound/misc/m_pickup.wav", - { "models/items/moneybag.md3", - NULL, NULL, NULL }, + { "models/items/moneybag.md3", + NULL, NULL, NULL }, /* icon */ "hud/weapons/moneybag", 1, /* pickup */ "Moneybag", @@ -1661,8 +1769,8 @@ { "item_scope", "sound/misc/it_pickup.wav", - { "models/weapons2/scope/scope.md3", - NULL, NULL, NULL }, + { "models/weapons2/scope/scope.md3", + NULL, NULL, NULL }, /* icon */ "hud/weapons/scope", 3, /* pickup */ "Scope", @@ -1680,8 +1788,8 @@ { "item_belt", "sound/misc/it_pickup.wav", - { "models/powerups/holdable/belt.md3", - NULL, NULL, NULL }, + { "models/powerups/holdable/belt.md3", + NULL, NULL, NULL }, /* icon */ "hud/weapons/belt", 1, /* pickup */ "Ammunition Belt", @@ -1704,7 +1812,7 @@ { "weapon_winch66", "sound/misc/w_pickup.wav", - { "models/weapons2/winch66/e_winchester66.md3", + { "models/weapons2/winch66/e_winchester66.md3", NULL, NULL, NULL }, /* icon */ "hud/weapons/winch66", 3, @@ -1723,7 +1831,7 @@ { "weapon_lightning", "sound/misc/w_pickup.wav", - { "models/weapons2/colt_light/e_lightning.md3", + { "models/weapons2/colt_light/e_lightning.md3", NULL, NULL, NULL }, /* icon */ "hud/weapons/lightning", 3, @@ -1743,7 +1851,7 @@ { "weapon_sharps", "sound/misc/w_pickup.wav", - { "models/weapons2/sharps/e_sharps.md3", + { "models/weapons2/sharps/e_sharps.md3", NULL, NULL, NULL }, /* icon */ "hud/weapons/sharps", 3, @@ -1762,7 +1870,7 @@ { "weapon_gatling", "sound/misc/w_pickup.wav", - { "models/weapons2/gatling/e_gatling.md3", + { "models/weapons2/gatling/e_gatling.md3", NULL, NULL, NULL }, /* icon */ "hud/weapons/gatling", 1, @@ -1771,7 +1879,7 @@ IT_WEAPON, WP_GATLING, 53, - WS_MGUN, + WS_SPECIAL, /* precache */ "", /* sounds */ "" }, @@ -1785,7 +1893,7 @@ { "weapon_remington58", "sound/misc/w_pickup.wav", - { "models/weapons2/remington58/e_remington58.md3", + { "models/weapons2/remington58/e_remington58.md3", NULL, NULL, NULL }, /* icon */ "hud/weapons/rem58", 3, @@ -1804,7 +1912,7 @@ { "weapon_schofield", "sound/misc/w_pickup.wav", - { "models/weapons2/schofield/e_schofield.md3", + { "models/weapons2/schofield/e_schofield.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/schofield", 3, @@ -1823,7 +1931,7 @@ { "weapon_peacemaker", "sound/misc/w_pickup.wav", - { "models/weapons2/peacemaker/e_peacemaker.md3", + { "models/weapons2/peacemaker/e_peacemaker.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/peacemaker", 3, @@ -1842,7 +1950,7 @@ { "weapon_dynamite", "sound/misc/w_pickup.wav", - { "models/weapons2/dyn/e_dynamite.md3", + { "models/weapons2/dyn/e_dynamite.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/dynamite", 3, @@ -1861,7 +1969,7 @@ { "weapon_molotov", "sound/misc/w_pickup.wav", - { "models/weapons2/molotov/e_molotov.md3", + { "models/weapons2/molotov/e_molotov.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/molotov", 3, @@ -1881,7 +1989,7 @@ { "weapon_knife", "sound/misc/w_pickup.wav", - { "models/weapons2/knife/e_knife.md3", + { "models/weapons2/knife/e_knife.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/knife", 3, @@ -1901,7 +2009,7 @@ { "weapon_shotgun", "sound/misc/w_pickup.wav", - { "models/weapons2/remgauge/e_remington.md3", + { "models/weapons2/remgauge/e_remington.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/remington", 3, @@ -1920,7 +2028,7 @@ { "weapon_sawedoff", "sound/misc/w_pickup.wav", - { "models/weapons2/sawedoff/e_sawedoff.md3", + { "models/weapons2/sawedoff/e_sawedoff.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/sawedoff", 3, @@ -1934,12 +2042,12 @@ /* sounds */ "" }, - /*QUAKED weapon_winch97 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +/*QUAKED weapon_winch97 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended */ { "weapon_winch97", "sound/misc/w_pickup.wav", - { "models/weapons2/winch97/e_winch97.md3", + { "models/weapons2/winch97/e_winch97.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/winch97", 3, @@ -1953,6 +2061,25 @@ /* sounds */ "" }, +/*QUAKED weapon_bow (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "weapon_bow", + "sound/misc/w_pickup.wav", + { "models/weapons2/bow/e_bow.md3", + NULL, NULL, NULL } , +/* icon */ "hud/weapons/bow_big", + 1, +/* pickup */ "Bow", + 10, + IT_WEAPON, + WP_BOW, + 18, + WS_SPECIAL, +/* precache */ "", +/* sounds */ "" + }, + // // AMMO ITEMS // @@ -1962,7 +2089,7 @@ { "ammo_shells", "sound/misc/am_pickup.wav", - { "models/powerups/ammo/shotgammo.md3", + { "models/powerups/ammo/shotgammo.md3", NULL, NULL, NULL } , /* icon */ "hud/ammo_shell", 3.2f, @@ -1981,7 +2108,7 @@ { "ammo_bullets", "sound/misc/am_pickup.wav", - { "models/powerups/ammo/pistolammo.md3", + { "models/powerups/ammo/pistolammo.md3", NULL, NULL, NULL } , /* icon */ "hud/ammo_bullet", 3.3f, @@ -2000,7 +2127,7 @@ { "ammo_dynamite", "sound/misc/am_pickup.wav", - { "models/powerups/ammo/dynammo.md3", + { "models/powerups/ammo/dynammo.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/dynamite", 3, @@ -2019,7 +2146,7 @@ { "ammo_molotov", "sound/misc/am_pickup.wav", - { "models/weapons2/molotov/e_molotov.md3", + { "models/weapons2/molotov/e_molotov.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/molotov", 3, @@ -2038,7 +2165,7 @@ { "ammo_knives", "sound/misc/am_pickup.wav", - { "models/weapons2/knife/e_knife.md3", + { "models/weapons2/knife/e_knife.md3", NULL, NULL, NULL } , /* icon */ "hud/weapons/knife", 3, @@ -2052,12 +2179,31 @@ /* sounds */ "" }, + /*QUAKED ammo_bow (.3 .3 1) (-16 -16 -16) (16 16 16) suspended +*/ + { + "ammo_bow", + "sound/misc/am_pickup.wav", + { "models/weapons2/bow/arrow.md3", + NULL, NULL, NULL } , +/* icon */ "hud/weapons/arrows", + 4, +/* pickup */ "Arrows", + 10, + IT_AMMO, + WP_BOW, + 12, + WS_SPECIAL, +/* precache */ "", +/* sounds */ "" + }, + /*QUAKED ammo_cartridges (.3 .3 1) (-16 -16 -16) (16 16 16) suspended */ { "ammo_cartridges", "sound/misc/am_pickup.wav", - { "models/powerups/ammo/rifleammo.md3", + { "models/powerups/ammo/rifleammo.md3", NULL, NULL, NULL } , /* icon */ "hud/ammo_cart", 4.1f, @@ -2076,7 +2222,7 @@ { "ammo_gatling", "sound/misc/am_pickup.wav", - { "models/powerups/ammo/rifleammo.md3", + { "models/powerups/ammo/rifleammo.md3", NULL, NULL, NULL } , /* icon */ "hud/ammo_sharps", 5.3f, @@ -2095,7 +2241,7 @@ { "ammo_sharps", "sound/misc/am_pickup.wav", - { "models/powerups/ammo/rifleammo.md3", + { "models/powerups/ammo/rifleammo.md3", NULL, NULL, NULL } , /* icon */ "hud/ammo_sharps", 5.3f, @@ -2333,6 +2479,7 @@ case WP_KNIFE: case WP_DYNAMITE: case WP_MOLOTOV: + case WP_BOW: // Molotovs, dynamites and knives can no longer be affected by belt double ammo effect. if ( ps->ammo[ item->giTag ] >= bg_weaponlist[item->giTag].maxAmmo ){ return qfalse; Index: code/game/g_weapon.c =================================================================== --- code/game/g_weapon.c (revision 537) +++ code/game/g_weapon.c (working copy) @@ -2071,6 +2071,9 @@ weapon_molotov_fire( ent); ent->client->ps.stats[STAT_WP_MODE] = 0; break; + case WP_BOW: + weapon_knife_fire( ent ); + break; #endif default: // FIXME G_Error( "Bad ent->s.weapon" ); Index: code/game/bg_public.h =================================================================== --- code/game/bg_public.h (revision 537) +++ code/game/bg_public.h (working copy) @@ -607,8 +607,9 @@ WP_SAWEDOFF, WP_WINCH97, - //automatics + //special weapons WP_GATLING, + WP_BOW, //explosives WP_DYNAMITE, // this always should be the last weapon after the special weapons @@ -1274,7 +1275,7 @@ WS_PISTOL, WS_RIFLE, WS_SHOTGUN, - WS_MGUN, + WS_SPECIAL, WS_MISC } wp_buy_type; #endif Index: code/game/g_cmds.c =================================================================== --- code/game/g_cmds.c (revision 537) +++ code/game/g_cmds.c (working copy) @@ -2443,12 +2443,15 @@ if (item->giTag == WP_BULLETS_CLIP) { item = BG_FindItemForAmmo(WP_BULLETS_CLIP); i = WP_PEACEMAKER; + } else if (item->giTag == WP_BOW) { + item = BG_FindItemForAmmo(WP_BOW); + i = WP_BOW; } else { if ( ps->stats[STAT_GATLING_MODE] ) i = WP_GATLING; else i = BG_FindPlayerWeapon(WP_WINCHESTER66, WP_DYNAMITE, ps); - if ( i ) + if ( i && bg_weaponlist[i].clip > 0 ) item = BG_FindItemForAmmo(bg_weaponlist[i].clip); else return; Index: code/cgame/cg_draw.c =================================================================== --- code/cgame/cg_draw.c (revision 537) +++ code/cgame/cg_draw.c (working copy) @@ -3749,6 +3749,9 @@ ammoitem = BG_FindItemForAmmo(item->giTag); Q_strncpyz(menu_items[count].string, va("%s(%i)", ammoitem->pickup_name, ammoitem->quantity), 64); } + else if(item->giTag == WP_BOW && item->giType == IT_AMMO){ + Q_strncpyz(menu_items[count].string, va("%s(%i)", item->pickup_name, item->quantity), 64); + } // check if clone if((cg.snap->ps.stats[STAT_WEAPONS] & (1<giTag)) && item->giType == IT_WEAPON @@ -3764,7 +3767,8 @@ (item->giTag == PW_BELT && cg.snap->ps.powerups[PW_BELT] && item->giType == IT_POWERUP) || (item->giType == IT_ARMOR && cg.snap->ps.stats[STAT_ARMOR])|| (item->giType == IT_POWERUP && item->giTag == PW_SCOPE && cg.snap->ps.powerups[PW_SCOPE]) || - (((item->giTag == WP_DYNAMITE || item->giTag == WP_KNIFE || WP_MOLOTOV) && item->giType == IT_WEAPON) && + ((((item->giTag == WP_DYNAMITE || item->giTag == WP_KNIFE || WP_MOLOTOV) && item->giType == IT_WEAPON) || + (item->giTag == WP_BOW && item->giType == IT_AMMO)) && cg.snap->ps.ammo[item->giTag] >= bg_weaponlist[item->giTag].maxAmmo))) { menu_items[count].inventory = qtrue; Index: code/cgame/cg_weapons.c =================================================================== --- code/cgame/cg_weapons.c (revision 537) +++ code/cgame/cg_weapons.c (working copy) @@ -876,6 +876,11 @@ weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav", qfalse ); cgs.media.rocketExplosionShader = trap_R_RegisterShader( "rocketExplosion" ); #else + case WP_BOW: + weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/bow/arrow.md3" ); // Spoon + weaponInfo->missileSound = cgs.media.dynamiteburn; + break; + case WP_DYNAMITE: weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/dyn/e_dynamite.md3" ); // Spoon cgs.media.dynamiteExplosionShader = trap_R_RegisterShader( "wqfx/dynexp"); @@ -3534,6 +3539,7 @@ break; #else case WP_KNIFE: + case WP_BOW: sfx = cgs.media.knifehit2; break; case WP_DYNAMITE: