Merge branch 'main' into contributions

This commit is contained in:
Petr Bartos 2023-04-06 19:12:07 +02:00
commit 4a1d90e729
30 changed files with 541 additions and 670 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.drbeef.jkxr"
android:versionCode="48"
android:versionName="0.8.0" android:installLocation="auto" >
android:versionCode="50"
android:versionName="1.0.0" android:installLocation="auto" >
<!-- Tell the system this app requires OpenGL ES 3.1. -->
<uses-feature android:glEsVersion="0x00030002" android:required="true"/>

View file

@ -164,6 +164,13 @@ void VR_SetHMDOrientation(float pitch, float yaw, float roll)
if (!vr.maxHeight || vr.maxHeight < 1.0) {
vr.maxHeight = vr.hmdposition[1];
}
//GB Instantiate initial velocity
if(!vr.tempWeaponVelocity)
{
vr.tempWeaponVelocity = 400.0f;
}
vr.curHeight = vr.hmdposition[1];
}

View file

@ -36,6 +36,9 @@ typedef struct {
bool third_person;
float fov_x;
float fov_y;
float tempWeaponVelocity;
bool immersive_cinematics;
bool weapon_stabilised;
bool right_handed;
@ -47,6 +50,7 @@ typedef struct {
int cgzoommode;
int cgzoomdir;
int saberBlockDebounce; // Amount of time after player is blocked that the saber position is fixed
short saberBounceMove;
int forceid;

View file

@ -17,6 +17,7 @@ Authors : Simon Brown
#include <client/client.h>
#include <statindex.h>
#include "android/sys_local.h"
#include "VrTBDC.h"
#ifdef JK2_MODE
#include "../OpenJK/codeJK2/game/weapons.h"
@ -121,12 +122,68 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
QuatToYawPitchRoll(pWeapon->Pose.orientation, rotation, vr.weaponangles[ANGLES_DEFAULT]);
QuatToYawPitchRoll(pOff->Pose.orientation, rotation, vr.offhandangles[ANGLES_DEFAULT]);
//if we are in saber block debounce, don't update the saber angles
if (vr.saberBlockDebounce < cl.serverTime) {
rotation[PITCH] = 45;
//If we are in a saberBlockDebounce thing then add on an angle
//Lerped upon how far from the start of the saber move
if (vr.saberBlockDebounce > cl.serverTime) {
float lerp = 0.0f;
//Where are we in the lerp
// 0 = vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME
// 1 = vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME / 2
// 0 (again) = vr.saberBlockDebounce
if(cl.serverTime < vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME / 2)
{
//Somewhere between 0 and 1
lerp = float(cl.serverTime - (vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME)) / float((vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME / 2) - (vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME));
}
else
{
//Somewhere between 1 and 0
lerp = 1 - float(cl.serverTime - (vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME / 2)) / float(vr.saberBlockDebounce - (vr.saberBlockDebounce - TBDC_SABER_BOUNCETIME / 2));
}
switch(vr.saberBounceMove) {
case VRLS_B1_BR:
rotation[PITCH] += lerp * TBDC_SABER_BOUNCEANGLE;
rotation[YAW] -= lerp * TBDC_SABER_BOUNCEANGLE;
break;
case VRLS_B1__R:
rotation[YAW] -= lerp * TBDC_SABER_BOUNCEANGLE;
break;
case VRLS_B1_TR:
rotation[PITCH] -= lerp * TBDC_SABER_BOUNCEANGLE;
rotation[YAW] -= lerp * TBDC_SABER_BOUNCEANGLE;
break;
case VRLS_B1_T_:
rotation[PITCH] -= lerp * TBDC_SABER_BOUNCEANGLE;
break;
case VRLS_B1_TL:
rotation[PITCH] -= lerp * TBDC_SABER_BOUNCEANGLE;
rotation[YAW] += lerp * TBDC_SABER_BOUNCEANGLE;
break;
case VRLS_B1__L:
rotation[YAW] += lerp * TBDC_SABER_BOUNCEANGLE;
break;
case VRLS_B1_BL:
rotation[PITCH] += lerp * TBDC_SABER_BOUNCEANGLE;
rotation[YAW] += lerp * TBDC_SABER_BOUNCEANGLE;
break;
default:
rotation[PITCH] -= lerp * TBDC_SABER_BOUNCEANGLE;
rotation[YAW] += lerp * (TBDC_SABER_BOUNCEANGLE / 2);
break;
}
}
/*else if(cl.serverTime > vr.saberBlockDebounce + 3000)
{
if(vr.saberBounceMove < 82)
{
vr.saberBounceMove = 82;
}
vr.saberBlockDebounce = cl.serverTime + TBDC_SABER_BOUNCETIME;
}*/
QuatToYawPitchRoll(pWeapon->Pose.orientation, rotation, vr.weaponangles[ANGLES_SABER]);
QuatToYawPitchRoll(pOff->Pose.orientation, rotation, vr.offhandangles[ANGLES_SABER]);
}
rotation[PITCH] = vr_weapon_pitchadjust->value;
QuatToYawPitchRoll(pWeapon->Pose.orientation, rotation, vr.weaponangles[ANGLES_ADJUSTED]);
@ -167,6 +224,14 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
vr.menu_right_handed = !vr.menu_right_handed;
}
}
//Close the datapad
if (((secondaryButtonsNew & secondaryButton2) !=
(secondaryButtonsOld & secondaryButton2)) &&
(secondaryButtonsNew & secondaryButton2)) {
Sys_QueEvent(0, SE_KEY, A_TAB, true, 0, NULL);
}
}
else
{
@ -349,6 +414,29 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
}
}
/*
//Parameter Changer
static bool changed = false;
if (between(-0.2f, primaryJoystickX, 0.2f) &&
between(0.8f, pPrimaryJoystick->y, 1.0f)) {
if(!changed) {
vr.tempWeaponVelocity += 25;
changed = true;
ALOGV("**TBDC** Projectile speed %f",vr.tempWeaponVelocity);
}
} else if (between(-0.2f, primaryJoystickX, 0.2f) &&
between(-1.0f, pPrimaryJoystick->y, -0.8f)) {
if(!changed) {
vr.tempWeaponVelocity -= 25;
ALOGV("**TBDC** Projectile speed %f",vr.tempWeaponVelocity);
changed = true;
}
}
else
{
changed = false;
}*/
//dominant hand stuff first
{
//Record recent weapon position for trajectory based stuff
@ -359,7 +447,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
VectorCopy(vr.weaponoffset, vr.weaponoffset_history[0]);
vr.weaponoffset_history_timestamp[0] = vr.weaponoffset_timestamp;
if (vr.saberBlockDebounce < cl.serverTime) {
VectorSet(vr.weaponposition, pWeapon->Pose.position.x,
pWeapon->Pose.position.y, pWeapon->Pose.position.z);
@ -368,7 +456,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
pWeapon->Pose.position.y, pWeapon->Pose.position.z);
VectorSubtract(vr.weaponoffset, vr.hmdposition, vr.weaponoffset);
vr.weaponoffset_timestamp = Sys_Milliseconds();
}
vec3_t velocity;
VectorSet(velocity, pWeapon->Velocity.linearVelocity.x,
@ -636,7 +724,8 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
// Check quicksave
static bool indicateQuickSave = true;
if (canUseQuickSave) {
int channel = (vr_control_scheme->integer >= 10) ? 2 : 1;
//GB Fix buzzing left controller not right
int channel = (vr_control_scheme->integer >= 10) ? 1 : 2;
if (indicateQuickSave)
{
TBXR_Vibrate(40, channel, 0.5); // vibrate to let user know they can switch

View file

@ -0,0 +1,53 @@
//
// Created by baggyg on 02/04/2023.
//
#ifndef JKXR_VRTBDC_H
#define JKXR_VRTBDC_H
//VELOCITIES
#define TBDC_BRYAR_PISTOL_VEL 3300
#define TBDC_BLASTER_VELOCITY 4200
#define TBDC_BOWCASTER_VELOCITY 3000
#define TBDC_REPEATER_VELOCITY 3000
#define TBDC_REPEATER_ALT_VELOCITY 1600
#define TBDC_DEMP2_VELOCITY 2500
#define TBDC_ROCKET_VELOCITY 2400
//FIRERATES
#define TBDC_BRYAR_PISTOL_FIRERATE 250
#define TBDC_BLASTER_FIRERATE 200
//SABERS
#define TBDC_SABER_BOUNCETIME 200
#define TBDC_SABER_BOUNCEANGLE 90
//SCALES
#define TBDC_SCALE_STOFFICER 102
#define TBDC_SCALE_STOFFICERALT 102
#define TBDC_SCALE_STCOMMANDER 103
#define TBDC_SCALE_IMPERIAL 101
#define TBDC_SCALE_IMPERIALOFFICER 102
#define TBDC_SCALE_IMPERIALCOMMANDER 103
#define TBDC_SCALE_REBORN 102
#define TBDC_SCALE_REBORNFORCEUSER 102
#define TBDC_SCALE_REBORNBOSS 103
#define TBDC_SCALE_REBORNACROBAT 102
typedef enum {
// Invalid, or saber not armed
VRLS_NONE = 0,
//Bounces
VRLS_B1_BR = 82,
VRLS_B1__R,
VRLS_B1_TR,
VRLS_B1_T_,
VRLS_B1_TL,
VRLS_B1__L,
VRLS_B1_BL
} vrBounce;
#endif //JKXR_VRTBDC_H

View file

@ -23,7 +23,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
// Current version of the single player game
#include "../win32/AutoVersion.h"
#define JKXR_VERSION "0.8.0"
#define JKXR_VERSION "1.0.0"
#ifdef _DEBUG
#define Q3_VERSION "(debug)OpenJK: v" VERSION_STRING_DOTTED " JKXR: " JKXR_VERSION

View file

@ -1769,7 +1769,10 @@ void *G2_FindSurface(const model_s *mod, int index, int lod)
mdxmLODSurfOffset_t *indexes = (mdxmLODSurfOffset_t *)current;
// we are now looking at the offset array
assert(index>=0&&index<mod->mdxm->numSurfaces);
if (index >= mod->mdxm->numSurfaces)
{
index = mod->mdxm->numSurfaces-1;
}
current += indexes->offsets[index];
return (void *)current;

View file

@ -32,6 +32,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "../game/wp_saber.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
#define LOOK_SWING_SCALE 0.5
@ -4781,11 +4782,13 @@ Ghoul2 Insert End
if (CG_getPlayer1stPersonSaber(cent) &&
cent->gent->client->ps.saberEventFlags & (SEF_BLOCKED|SEF_PARRIED) &&
cent->gent->client->ps.saberBounceMove != LS_NONE &&
vr->saberBlockDebounce < cg.time)
{
cvar_t *vr_saber_block_debounce_time = gi.cvar("vr_saber_block_debounce_time", "200", CVAR_ARCHIVE); // defined in VrCvars.h
vr->saberBlockDebounce = cg.time + vr_saber_block_debounce_time->integer;
//cvar_t *vr_saber_block_debounce_time = gi.cvar("vr_saber_block_debounce_time", "1000", CVAR_ARCHIVE); // defined in VrCvars.h
//vr->saberBlockDebounce = cg.time + vr_saber_block_debounce_time->integer;
vr->saberBlockDebounce = cg.time + TBDC_SABER_BOUNCETIME;
vr->saberBounceMove = cent->gent->client->ps.saberBounceMove;
cgi_HapticEvent("shotgun_fire", 0, 0, 100, 0, 0);
}

View file

@ -2035,11 +2035,40 @@ int NPC_ShotEntity( gentity_t *ent, vec3_t impactPos )
}
int location = Q_irand(0, 99);
if (location < 65 || cg.renderingThirdPerson ||
int torsoRatio = 65;
int legsRatio = 20;
int headRatio = 15;
switch ( g_spskill->integer )
{
//Easiest difficulty, low chance of hittitng anything else
case 0:
torsoRatio = 90;
legsRatio = 5;
headRatio = 5;
break;
//Medium difficulty, half-half chance of picking up the player
case 1:
torsoRatio = 60;
legsRatio = 25;
headRatio = 15;
break;
//Hardest difficulty, always turn on attacking player
case 2:
default:
torsoRatio = 50;
legsRatio = 35;
headRatio = 15;
break;
}
if (location < torsoRatio || cg.renderingThirdPerson ||
ent->client == NULL || ent->client->ps.clientNum != 0) {
// 65% chance (unless ent is not the player, then always go for chest, which is original behaviour)
CalcEntitySpot(ent, SPOT_CHEST, targ);
} else if (location < 85) {
} else if (location < legsRatio + torsoRatio) {
// 20% chance
CalcEntitySpot(ent, SPOT_LEGS, targ);
} else {

View file

@ -27,6 +27,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "b_local.h"
#include "b_public.h"
#include "anims.h"
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
extern qboolean NPCsPrecached;
extern vec3_t playerMins;
@ -1082,6 +1084,51 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC )
NPCName = "Player";
}
//Override scale due to TBDC
if(g_TeamBeefDirectorsCut->value)
{
if(!Q_stricmp( NPCName, "STOfficer" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_STOFFICER /100.0f;
}
else if(!Q_stricmp( NPCName, "STOfficerAlt" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_STOFFICERALT /100.0f;
}
else if(!Q_stricmp( NPCName, "STCommander" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_STOFFICERALT /100.0f;
}
else if(!Q_stricmp( NPCName, "Imperial" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_IMPERIAL /100.0f;
}
else if(!Q_stricmp( NPCName, "ImpOfficer" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_IMPERIALOFFICER /100.0f;
}
else if(!Q_stricmp( NPCName, "ImpCommander" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_IMPERIALCOMMANDER /100.0f;
}
else if(!Q_stricmp( NPCName, "RebornAcrobat" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORNACROBAT /100.0f;
}
else if(!Q_stricmp( NPCName, "Reborn" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORN /100.0f;
}
else if(!Q_stricmp( NPCName, "RebornForceUser" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORNFORCEUSER /100.0f;
}
else if(!Q_stricmp( NPCName, "RebornFencer" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORNBOSS /100.0f;
}
}
if ( NPC->NPC )
{
stats = &NPC->NPC->stats;
@ -1221,6 +1268,50 @@ qboolean NPC_ParseParms( const char *NPCName, gentity_t *NPC )
if ( !Q_stricmp( token, "}" ) )
{
//Override scale due to TBDC
if(g_TeamBeefDirectorsCut->value)
{
if(!Q_stricmp( NPCName, "STOfficer" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_STOFFICER /100.0f;
}
else if(!Q_stricmp( NPCName, "STOfficerAlt" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_STOFFICERALT /100.0f;
}
else if(!Q_stricmp( NPCName, "STCommander" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_STOFFICERALT /100.0f;
}
else if(!Q_stricmp( NPCName, "Imperial" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_IMPERIAL /100.0f;
}
else if(!Q_stricmp( NPCName, "ImpOfficer" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_IMPERIALOFFICER /100.0f;
}
else if(!Q_stricmp( NPCName, "ImpCommander" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_IMPERIALCOMMANDER /100.0f;
}
else if(!Q_stricmp( NPCName, "RebornAcrobat" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORNACROBAT /100.0f;
}
else if(!Q_stricmp( NPCName, "Reborn" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORN /100.0f;
}
else if(!Q_stricmp( NPCName, "RebornForceUser" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORNFORCEUSER /100.0f;
}
else if(!Q_stricmp( NPCName, "RebornFencer" ))
{
NPC->s.modelScale[0] = NPC->s.modelScale[1] = NPC->s.modelScale[2] = TBDC_SCALE_REBORNBOSS /100.0f;
}
}
break;
}
//===MODEL PROPERTIES===========================================================
@ -2220,15 +2311,21 @@ Ghoul2 Insert End
return qtrue;
}
extern cvar_t *g_TeamBeefDirectorsCut;
void NPC_LoadParms( void )
{
int len, totallen, npcExtFNLen, mainBlockLen, fileCnt, i;
const char filename[] = "ext_data/NPCs.cfg";
char npcs_filename[64];
Com_sprintf(npcs_filename, sizeof(npcs_filename), "ext_data/%s.cfg",
g_TeamBeefDirectorsCut->integer ? "npcs" : "npcs_og");
char *buffer, *holdChar, *marker;
char npcExtensionListBuf[2048]; // The list of file names read in
//First, load in the npcs.cfg
len = gi.FS_ReadFile( filename, (void **) &buffer );
len = gi.FS_ReadFile( npcs_filename, (void **) &buffer );
if ( len == -1 ) {
gi.Printf( "file not found\n" );
return;

View file

@ -39,6 +39,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "wp_saber.h"
#include <float.h>
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
extern qboolean G_DoDismemberment( gentity_t *self, vec3_t point, int mod, int damage, int hitLoc, qboolean force = qfalse );
extern qboolean G_EntIsUnlockedDoor( int entityNum );
@ -7642,6 +7644,7 @@ void PM_WeaponLightsaber(void)
PM_AddEvent( EV_FIRE_WEAPON );
if ( !addTime )
{
addTime = weaponData[pm->ps->weapon].fireTime;
if ( g_timescale != NULL )
{
@ -8403,7 +8406,20 @@ static void PM_Weapon( void )
return;
}
PM_AddEvent( EV_FIRE_WEAPON );
if(pm->ps->weapon == WP_BRYAR_PISTOL && g_TeamBeefDirectorsCut->value)
{
addTime = TBDC_BRYAR_PISTOL_FIRERATE;
}
else if(pm->ps->weapon == WP_BLASTER && g_TeamBeefDirectorsCut->value)
{
addTime = TBDC_BLASTER_FIRERATE;
}
else
{
addTime = weaponData[pm->ps->weapon].fireTime;
}
switch( pm->ps->weapon)
{

View file

@ -35,6 +35,9 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "wp_saber.h"
#include "Q3_Interface.h"
#include "../../code/qcommon/strippublic.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
extern cvar_t *g_debugDamage;
extern qboolean stop_icarus;
@ -4992,7 +4995,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_
knockback = 0;
}
// figure momentum add, even if the damage won't be taken
if ( knockback && !(dflags&DAMAGE_DEATH_KNOCKBACK) ) //&& targ->client
if ( knockback && (!(dflags&DAMAGE_DEATH_KNOCKBACK) || g_TeamBeefDirectorsCut->value)) //&& targ->client
{
G_ApplyKnockback( targ, newDir, knockback );
G_CheckKnockdown( targ, attacker, newDir, dflags, mod );
@ -5349,6 +5352,10 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_
{//special case because this is shotgun-ish damage, we need to multiply the knockback
knockback *= 12;//*6 for 6 flechette shots
}
else if(g_TeamBeefDirectorsCut->value)
{
knockback *= 2;
}
G_ApplyKnockback( targ, newDir, knockback );
}

View file

@ -29,7 +29,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "g_functions.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//---------------
// Blaster
//---------------
@ -54,6 +55,11 @@ static void WP_FireBlasterMissile( gentity_t *ent, vec3_t start, vec3_t dir, qbo
}
}
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
velocity = TBDC_BLASTER_VELOCITY;
}
WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall
gentity_t *missile = CreateMissile( start, dir, velocity, 10000, ent, altFire );
@ -121,10 +127,16 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire )
if ( alt_fire )
{
if(vr->weapon_stabilised) {
// add some slop to the alt-fire direction
angs[PITCH] += Q_flrand(-0.5f, 0.5f) * BLASTER_ALT_SPREAD;
angs[YAW] += Q_flrand(-0.5f, 0.5f) * BLASTER_ALT_SPREAD;
} else {
// add some slop to the alt-fire direction
angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_ALT_SPREAD;
angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_ALT_SPREAD;
}
}
else
{
// Troopers use their aim values as well as the gun's inherent inaccuracy
@ -139,12 +151,20 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire )
else
{
if(vr->cgzoommode != 4) { // much more accurate if using the scope
//GB - If double handing reduce by two thirds
if(vr->weapon_stabilised)
{
// 1/3 as much variety if stabilised
angs[PITCH] += Q_flrand(-0.33f, 0.33f) * BLASTER_MAIN_SPREAD;
angs[YAW] += Q_flrand(-0.33f, 0.33f) * BLASTER_MAIN_SPREAD;
} else {
// add some slop to the main-fire direction
angs[PITCH] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD;
angs[YAW] += Q_flrand(-1.0f, 1.0f) * BLASTER_MAIN_SPREAD;
}
}
}
}
AngleVectors( angs, dir, NULL, NULL );

View file

@ -29,6 +29,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//-------------------
// Wookiee Bowcaster
@ -98,7 +100,14 @@ static void WP_BowcasterMainFire( gentity_t *ent )
for ( int i = 0; i < count; i++ )
{
// create a range of different velocities
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
vel = TBDC_BOWCASTER_VELOCITY * ( Q_flrand(-1.0f, 1.0f) * BOWCASTER_VEL_RANGE + 1.0f );;
}
else
{
vel = BOWCASTER_VELOCITY * ( Q_flrand(-1.0f, 1.0f) * BOWCASTER_VEL_RANGE + 1.0f );
}
vectoangles( forward, angs );
@ -160,8 +169,12 @@ static void WP_BowcasterAltFire( gentity_t *ent )
}
WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall
gentity_t *missile = CreateMissile( start, forward, BOWCASTER_VELOCITY, 10000, ent, qtrue );
float velocity = BOWCASTER_VELOCITY;
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
velocity = TBDC_BOWCASTER_VELOCITY;
}
gentity_t *missile = CreateMissile( start, forward, velocity, 10000, ent, qtrue );
missile->classname = "bowcaster_alt_proj";
missile->s.weapon = WP_BOWCASTER;

View file

@ -28,6 +28,9 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "w_local.h"
#include "g_functions.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//---------------
// Bryar Pistol
@ -69,8 +72,12 @@ void WP_FireBryarPistol( gentity_t *ent, qboolean alt_fire )
AngleVectors( angs, forward, NULL, NULL );
}
gentity_t *missile = CreateMissile( start, forward, BRYAR_PISTOL_VEL, 10000, ent, alt_fire );
float velocity = BRYAR_PISTOL_VEL;
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
velocity = TBDC_BRYAR_PISTOL_VEL;
}
gentity_t *missile = CreateMissile( start, forward, velocity, 10000, ent, alt_fire );
missile->classname = "bryar_proj";
missile->s.weapon = WP_BRYAR_PISTOL;

View file

@ -28,6 +28,9 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "w_local.h"
#include "g_functions.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//-------------------
// DEMP2
@ -52,7 +55,12 @@ static void WP_DEMP2_MainFire( gentity_t *ent )
WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall
gentity_t *missile = CreateMissile( start, forward, DEMP2_VELOCITY, 10000, ent );
float velocity = DEMP2_VELOCITY;
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
velocity = TBDC_DEMP2_VELOCITY;
}
gentity_t *missile = CreateMissile( start, forward, velocity, 10000, ent );
missile->classname = "demp2_proj";
missile->s.weapon = WP_DEMP2;

View file

@ -28,6 +28,8 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "w_local.h"
#include "g_functions.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//-----------------------
// Golan Arms Flechette

View file

@ -28,6 +28,9 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "w_local.h"
#include "g_functions.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//-------------------
// Heavy Repeater
@ -41,7 +44,12 @@ static void WP_RepeaterMainFire( gentity_t *ent, vec3_t dir, vec3_t start )
WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall
gentity_t *missile = CreateMissile( start, dir, REPEATER_VELOCITY, 10000, ent );
float velocity = REPEATER_VELOCITY;
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
velocity = TBDC_REPEATER_VELOCITY;
}
gentity_t *missile = CreateMissile( start, dir, velocity, 10000, ent );
missile->classname = "repeater_proj";
missile->s.weapon = WP_REPEATER;
@ -105,7 +113,12 @@ static void WP_RepeaterAltFire( gentity_t *ent )
}
else
{
missile = CreateMissile( start, forward, REPEATER_ALT_VELOCITY, 10000, ent, qtrue );
float velocity = REPEATER_ALT_VELOCITY;
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
velocity = TBDC_REPEATER_ALT_VELOCITY;
}
missile = CreateMissile( start, forward, velocity, 10000, ent, qtrue );
}
missile->classname = "repeater_alt_proj";

View file

@ -28,7 +28,9 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "w_local.h"
#include "g_functions.h"
#include "bg_local.h"
#include <JKXR/VrClientInfo.h>
#include <JKXR/VrTBDC.h>
extern cvar_t *g_TeamBeefDirectorsCut;
//-----------------------
// Rocket Launcher
//-----------------------
@ -147,6 +149,11 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire )
int damage = weaponData[WP_ROCKET_LAUNCHER].damage;
float vel = ROCKET_VELOCITY;
if(ent->client && ent->client->ps.clientNum == 0 && g_TeamBeefDirectorsCut->value)
{
vel = TBDC_ROCKET_VELOCITY;
}
if ( alt_fire )
{
vel *= 0.5f;
@ -165,6 +172,7 @@ void WP_FireRocket( gentity_t *ent, qboolean alt_fire )
WP_TraceSetStart( ent, start, vec3_origin, vec3_origin );//make sure our start point isn't on the other side of a wall
gentity_t *missile = CreateMissile( start, forward, vel, 10000, ent, alt_fire );
missile->classname = "rocket_proj";

128
README.md
View file

@ -1,31 +1,133 @@
![JKXR Banner](https://github.com/DrBeef/JKXR/blob/main/assets/FemaleVRJedi.png)
![JKXR Banner](https://github.com/DrBeef/JKXR/blob/main/assets/JKXRGithub.jpg)
===
JKXR is a VR port using OpenXR (the open standard for virtual and augmented reality devices) is based on the excellent OpenJK port, originally forked from: https://github.com/JACoders/OpenJK
# JK XR
This is currently built solely for standalone VR HMDs and will **not** run on any other device, currently the list of supported devices is: Meta Quest (1, 2, Pro) and Pico (3 & 4).
[SideQuest Latest Version (Meta Headsets)](https://sidequestvr.com/app/15472)
[SideQuest Latest Version (Pico Headsets)](https://sidequestvr.com/app/)
JK XR is a VR port of the Jedi Knight games using OpenXR (the open standard for virtual and augmented reality devices) and is based on the excellent OpenJK port, originally forked from: https://github.com/JACoders/OpenJK
This is currently built for standalone VR HMDs (see the Building section below) and will currently **not** run on any other device, the list of supported devices is: Meta Quest (1, 2, Pro) and Pico (3 & 4).
Support for PCVR based devices will hopefully come in the future.
The easiest way to install this on your device is using SideQuest, a Desktop app designed to simplify sideloading apps and games.
Download SideQuest here:
The easiest way to install this on your device is using SideQuest. Download SideQuest here:
https://github.com/the-expanse/SideQuest/releases
IMPORTANT NOTE
--------------
### Jedi Knight: Jedi Outcast
This is just an engine port; the apk does not contain any of the of Jedi Knight game assets. If you wish to play the full game you must purchase it yourself, steam is most straightforward: https://store.steampowered.com/app/6030/STAR_WARS_Jedi_Knight_II__Jedi_Outcast/
The public release of JK XR currently supports the game Jedi Outcast; access to the Jedi Academy early-access build can be found on the Team Beef patreon (link below). However there are lots of mods and access to the free demo level available through the accomapnying JK XR Companion App, which is also installed alongside JK XR on SideQuest.
## Team Beef Patreon
[![Team Beef Patreon](https://github.com/DrBeef/JKXR/blob/main/assets/PatreonBanner.jpg)](https://www.patreon.com/teambeef)
The Team Beef Patreon where you can find all the in-development early-access builds for JK XR with Jedi Academy support, as well as other active projects can be found.
INSTALLATION AND SETUP
----------------------
## Gameplay and VR Features
The same APK will work on all supported devices.
### VR Features
* New Fully Modelled VR Weapons
* Full Motion Controlled Light Saber
* Real Collision based Laser Deflections
* Weapon / Force wheels
* Gesture Based Use / Interact
* Gesture based Force Actions (Push, Pull and Grab)
* Weapon Scopes
* Gesture Based Saber Throw
* Companion App
### Gameplay Modes (accessible via Setup -> Difficulty in the Menu)
**Team Beef Directors Cut (TBDC) - On (Default is On)**
This version uses faithful enemy speeds and aggression from the original game, which are fast and challenging by modern standards. To balance this projectile speeds and gun power are raised to feel more canon to the Star Wars movies and prevent Stormtroopers and other enemies from being able to avoid gunfire by strafing. There are also exaggerated knockback effects. This mode is more arcade-y fast paced affair whilst feeling similar to the difficulty level of the twitch-based gameplay of the original game.
**Team Beef Directors Cut (TBDC) - Off**
Projectile speeds are faithful to the original game, but enemy movement and aggression are toned back, where stormtroopers don't have an easy time to flank you. You may need to still "lead" shots slightly ahead of enemies when they are on the move. Recommended for a slower paced tactical encounter
To switch between modes change the option and if already in-game, restart the level you are on.
### Companion App
The companion app will be installed at the same time when using the SideQuest official page. This allows you to download mods and addons and switch between launching single player missions and the main game. This also detects if you've correctly set up the main application and asset files so is a good place to look if you are having issues.
![image](https://user-images.githubusercontent.com/4569081/230429909-2df64bb6-e200-496f-ba5f-bda763539de0.png)
## IMPORTANT NOTE
*This is just an engine port*; the apk does not contain any of the of Jedi Knight game assets. If you wish to play the full game you must purchase it yourself, steam is most straightforward: https://store.steampowered.com/app/6030/STAR_WARS_Jedi_Knight_II__Jedi_Outcast/
# Installation and Setup
You can find the latest version, which also includes the Companion App hosted on Sidequest. Use the links at the top of the page (separated by headset). Before installing via SideQuest you must have enabled "Developer Mode" on your headset. You can find the details on how to do that below:
Pico 3/4 Instructions
https://trello.com/c/Idb627uv/47-pico-4-installation-instructions
Meta Quest Install Instructions
https://trello.com/c/C0YTFpvX/48-quest-quest-2-installation-instructions
Pico 3/4 Install Instructions
https://trello.com/c/Idb627uv/47-pico-4-installation-instructions
## Copying the Full Game files to your Oculus Quest
Before you are able to run the full game of Jedi Knight: Jedi Outcast in VR you will need to:
- Install JK XR thought SideQuest (this will also install the companion app)
- Start JK XR for the first time, it will ask for appropriate permissions (which you must allow), create the necessary folders and then close down
- You can now run the Companion App. This will check that it has the files for the full game.
- (optional) Copy only the assets files (assets0.pk3, assets1.pk3, assets2.pk3, assets5.pk3) from your PC install of JKO (Jedi Outcast\GameData\base) into the following folder on your device:
\JKXR\JK2\base
- You must then use the Companion App to download any mods and start the game. It is possible to play the JK Demo without having copied across the full game assets. All other mods require the full game.
### Save Games File
Save game files are stored on the internal memory of your device. This means that if you uninstall/reinstall JK XR all the saves are retained. If you change headset just make sure you copy your saves to the new device.
Any update will not affect any of your save game files.
## Controls and configuration
### Tutorials
You can find tutorial videos on how to use the special VR features in the in-game Controls -> JKXR HELP menu.
![image](https://user-images.githubusercontent.com/4569081/230427577-59d77ff2-b960-4817-bbcd-d7722dcd1ead.png)
### Control Scheme
This control scheme on how to play can also be found in the Controls -> JKXR HELP in the game.
![Control Scheme](https://github.com/DrBeef/JKXR/blob/main/z_vr_assets_base/gfx/menus/control_scheme.jpg)
## Building from Source
If you wish to build JK XR from source, then you need the following:
* Android Developer Studio
* Android SDK API level 24
* Latest Android Native Development Kit
* The OpenXR release archive for your headset
There is no dependency on any specific headset native libraries, as this port uses OpenXR and links against the opensource Android openxr_loader.so. If you wish to build for a specific headset, then you need to place the openxr_loader.so for the headset into the following folder and rename it to: openxr_loader_{device}.so where {device} is either *meta* or *pico* (further device support hopefully in the future):
JKXR\Projects\Android\libs\arm64-v8a
## Credits
* Team Beef are DrBeef, Baggyg, Bummser
* Lead programmer: DrBeef
* JKXR Companion App: BaggyG
* Additional Development Contributions: MuadDib, BaggyG
* VR Compatible Weapon Models: Vince Crusty and Elin
* With Special Thanks to: Team Beef patrons, all Team Beef discord members,
the OpenJK Development Team and Raven Software for
creating and open-sourcing these wonderful games

Binary file not shown.

Before

Width:  |  Height:  |  Size: 460 KiB

BIN
assets/JKXRGithub.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
assets/PatreonBanner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 KiB

View file

@ -156,7 +156,7 @@
name none
type ITEM_TYPE_TEXT
rect 0 240 640 40
text "MuadDib"
text "MuadDib, BaggyG"
font 2
forecolor 1 1 1 1
textscale 1.0

View file

@ -1,610 +0,0 @@
// EXTERNAL WEAPON & AMMO DATA
//
// NOTE!!!!!!!!! Weapontype must start the block of weapon data.
// NOTE!!!!!!!!! Ammo must start the block of ammo data.
//
// Weapontype - weapon data is associated with which weapon (must be first)
// WP_NONE
// WP_PHASER
// WP_COMPRESSION_RIFLE
// WP_IMOD
// WP_SCAVENGER_RIFLE
// WP_STASIS
// WP_GRENADE_LAUNCHER,
// WP_TETRION_DISRUPTOR,
// WP_DREADNOUGHT,
// WP_QUANTUM_BURST,
// WP_BORG_WEAPON
// WP_BORG_TASER
// WP_BORG_ASSIMILATOR
// WP_BORG_DRILL
// WP_TRICORDER
//
// Weaponclass - weapon name
// Weaponmodel - weapon model used in game
// weaponicon - interface image
// Ammotype - type of power weapon needs to fire
// 0 - No power
// 1 - Star Fleet power
// 2 - Alien Crystal power
// 3 - Phaser power
// Ammolowcount - amount when "Low ammo" warning appears on screen
// Flashcolor - color generate by weapon flash (R,G,B)
// Firingsound - sound file used when firing
// altfiringsound - sound file used when alt-firing
// flashsound - sound file used by flash
// altflashsound - sound file used by an alt-fire flash
// stopsound - sound file used when a firing sound stops
// Firetime - amount of time between firings
// altfireTime - for alt fire
// Range - range of weapon
// energyPerShot - amount of energy used per shot
// altenergypershot- for alt fire
// barrelcount - number of barrels the model has (weaponname_b?.md3)
// missileModel - missile .md3
// altmissileModel - alternate missile .md3
// missileSound - played while flying
// altmissileSound - alternate missile launch sound
// missileLight - intensity of lightsource for missile - if 0.0 then none (float)
// altmissileLight - alternate missile light
// missileLightColor - color in three float style R, G, B (0.0 to 1.0) - NOTE - if you have a light, you MUST HAVE THESE
// altmissileLightColor - alternate color in three float style R, G, B (0.0 to 1.0)
// missileHitSound - played on impact
// altmissileHitSound - for alt fire
// missileFuncName - missile fly function
// altmissileFuncName - for alt fire
//
// FUNCTION NAMES
// borgfunc
// scavengerfunc
// altscavengerfunc
// stasisfunc
// grenadefunc
// altgrenadefunc
// tetrionfunc
// dreadnoughtfunc
// quantumfunc
// quantumaltfunc
// botrocketfunc
// forgeprojfunc
// forgeprojfunc2
// forgepsychfunc
// parasiteacidfunc
// stasisattackfunc
// loaderlaserfunc
// botprojfunc
//
// For AMMO Types
// ammoicon - STRING
// ammomax - INT
// WP_NULL
{
WEAPONTYPE WP_NONE
}
// WP_STUN_BATON
{
weapontype WP_STUN_BATON
weaponclass weapon_stun_baton
weaponmodel models/weapons2/stun_baton/baton.md3
weaponIcon gfx/hud/w_icon_stunbaton
firingsound sound/weapons/baton/idle.wav
barrelcount 3
ammotype 1
ammolowcount 5
energypershot 0
firetime 400
range 8192
altenergypershot 0
altfiretime 400
altrange 8192
}
// WP_SABER
{
weapontype WP_SABER
weaponclass weapon_saber
weaponmodel models/weapons2/saber/saber_w.md3
weaponIcon gfx/hud/w_icon_lightsaber
firingsound sound/weapons/saber/saberhum1.wav
ammotype 1
ammolowcount 5
energypershot 1
firetime 100
range 8192
altenergypershot 3
altfiretime 100
altrange 8192
missilemodel models/weapons2/saber/saber_w.md3
}
// WP_BRYAR_PISTOL
{
weapontype WP_BRYAR_PISTOL
weaponclass weapon_bryar_pistol
weaponmodel models/weapons2/briar_pistol/briar_pistol.md3
weaponIcon gfx/hud/w_icon_briar
missileFuncName bryar_func
altmissileFuncName bryar_alt_func
ammotype 2
ammolowcount 15
energypershot 1
firetime 300 //400
range 8192
altenergypershot 1
altfiretime 400
altrange 8192
muzzleEffect bryar/muzzle_flash
altmuzzleEffect bryar/altmuzzle_flash
altchargesound sound/weapons/bryar/altcharge.wav
selectSound sound/weapons/bryar/select.wav
}
// WP_BLASTER
{
weapontype WP_BLASTER
weaponclass weapon_blaster
weaponmodel models/weapons2/blaster_r/blaster.md3
weaponIcon gfx/hud/w_icon_blaster
ammotype 2
ammolowcount 15
energypershot 1
firetime 300 //350
range 8192
altenergypershot 2
altfiretime 150
altrange 8192
missileFuncName blaster_func
altmissileFuncName blaster_alt_func
muzzleEffect blaster/muzzle_flash
altmuzzleEffect blaster/altmuzzle_flash
selectSound sound/weapons/blaster/select.wav
}
// WP_DISRUPTOR
{
weapontype WP_DISRUPTOR
weaponclass weapon_disruptor
weaponmodel models/weapons2/disruptor/disruptor.md3
weaponIcon gfx/hud/w_icon_disruptor
ammotype 3
ammolowcount 15
energypershot 3
barrelcount 1
firetime 600
range 8192
altenergypershot 3
altfiretime 1300
altrange 8192
muzzleEffect disruptor/muzzle_flash
altmuzzleEffect disruptor/altmuzzle_flash
selectSound sound/weapons/disruptor/select.wav
altchargesound sound/weapons/disruptor/altCharge.wav
}
// WP_BOWCASTER
{
weapontype WP_BOWCASTER
weaponclass weapon_bowcaster
weaponmodel models/weapons2/bowcaster/bowcaster.md3
weaponIcon gfx/hud/w_icon_bowcaster
altchargesound sound/weapons/bowcaster/altcharge.wav
ammotype 3
ammolowcount 15
energypershot 5
firetime 750
range 8192
altenergypershot 5
altfiretime 400
altrange 8192
missileFuncName bowcaster_func
altmissileFuncName bowcaster_func
muzzleEffect bowcaster/muzzle_flash
altmuzzleEffect bowcaster/altmuzzle_flash
selectSound sound/weapons/bowcaster/select.wav
chargesound sound/weapons/bowcaster/altcharge.wav
}
// WP_REPEATER
{
weapontype WP_REPEATER
weaponclass weapon_repeater
weaponmodel models/weapons2/heavy_repeater/heavy_repeater.md3
weaponIcon gfx/hud/w_icon_repeater
ammotype 4
ammolowcount 25
energypershot 1
firetime 50
range 8192
altenergypershot 8
altfiretime 800
altrange 8192
barrelcount 1
missileFuncName repeater_func
altmissileFuncName repeater_alt_func
muzzleEffect repeater/muzzle_flash
altmuzzleEffect repeater/altmuzzle_flash
selectSound sound/weapons/repeater/select.wav
}
// WP_DEMP2
{
weapontype WP_DEMP2
weaponclass weapon_demp2
weaponmodel models/weapons2/demp2/demp2.md3
weaponIcon gfx/hud/w_icon_demp2
ammotype 3
ammolowcount 15
energypershot 8
firetime 450
range 8192
altenergypershot 10
altfiretime 1200
altrange 8192
missileFuncName demp2_func
muzzleEffect demp2/muzzle_flash
altmissileFuncName demp2_alt_func
altmuzzleEffect demp2/altmuzzle_flash
selectSound sound/weapons/demp2/select.wav
altchargesound sound/weapons/demp2/altCharge.wav
}
// WP_FLECHETTE
{
weapontype WP_FLECHETTE
weaponclass weapon_flechette
weaponmodel models/weapons2/golan_arms/golan_arms.md3
barrelcount 1
ammotype 4
ammolowcount 15
firetime 550
energypershot 8
range 8192
weaponIcon gfx/hud/w_icon_flechette
altenergypershot 8
altfiretime 400
altrange 8192
missileFuncName flechette_func
missileModel models/weapons2/golan_arms/projectileMain.md3
altmissileFuncName flechette_alt_func
muzzleEffect flechette/muzzle_flash
altmuzzleEffect flechette/altmuzzle_flash
altmissileModel models/weapons2/golan_arms/projectile.md3
selectSound sound/weapons/flechette/select.wav
}
// WP_ROCKET_LAUNCHER
{
weapontype WP_ROCKET_LAUNCHER
weaponclass weapon_rocket_launcher
weaponmodel models/weapons2/merr_sonn/merr_sonn.md3
ammotype 5
ammolowcount 1
firetime 600
energypershot 1
range 8192
weaponIcon gfx/hud/w_icon_merrsonn
barrelcount 1
altenergypershot 1
altfiretime 1000
altrange 8192
missileLight 125
missileLightColor 1.0 1.0 0.5
altmissileLight 125
altmissileLightColor 1.0 1.0 0.5
missileFuncName rocket_func
altmissileFuncName rocket_alt_func
muzzleEffect rocket/muzzle_flash2
altmuzzleEffect rocket/altmuzzle_flash
missileModel models/weapons2/merr_sonn/projectile.md3
altmissileModel models/weapons2/merr_sonn/projectile.md3
missilesound sound/weapons/rocket/missleloop.wav
altmissilesound sound/weapons/rocket/missleloop.wav
selectSound sound/weapons/rocket/select.wav
}
// WP_THERMAL
{
weapontype WP_THERMAL
weaponclass weapon_thermal
weaponmodel models/weapons2/thermal/thermal.md3
weaponIcon gfx/hud/w_icon_thermal
ammotype 7
ammolowcount 1
energypershot 1
firetime 800
range 8192
altenergypershot 1
altfiretime 400
altrange 8192
missileModel models/weapons2/thermal/thermal_proj.md3
altmissileModel models/weapons2/thermal/thermal_proj.md3
barrelcount 0
chargesound sound/weapons/thermal/charge.wav
altchargesound sound/weapons/thermal/charge.wav
selectSound sound/weapons/thermal/select.wav
muzzleEffect thermal/muzzle_flash
}
// WP_TRIP_MINE
{
weapontype WP_TRIP_MINE
weaponclass weapon_trip_mine
weaponmodel models/weapons2/laser_trap/laser_trap.md3
weaponIcon gfx/hud/w_icon_tripmine
ammotype 8
ammolowcount 1
energypershot 1
firetime 800
range 8192
altenergypershot 1
altfiretime 400
altrange 8192
missileModel models/weapons2/laser_trap/laser_trap_w.glm
altmissileModel models/weapons2/laser_trap/laser_trap_w.glm
selectSound sound/weapons/detpack/select.wav
muzzleEffect tripmine/muzzle_flash
}
// WP_DET_PACK
{
weapontype WP_DET_PACK
weaponclass weapon_det_pack
weaponmodel models/weapons2/detpack/det_pack.md3
weaponIcon gfx/hud/w_icon_detpack
ammotype 9
ammolowcount 1
energypershot 1
firetime 800
range 8192
altenergypershot 0
altfiretime 400
altrange 8192
missileModel models/weapons2/detpack/det_pack_proj.glm
selectSound sound/weapons/detpack/select.wav
muzzleEffect detpack/muzzle_flash
}
// WP_EMPLACED_GUN
{
weapontype WP_EMPLACED_GUN
weaponclass weapon_emplaced_gun
weaponmodel models/weapons2/noweap/noweap.md3
altenergypershot 1
altrange 8192
missileFuncName emplaced_func
altmissileFuncName emplaced_func
ammotype 6
ammolowcount 15
energypershot 1
firetime 150
altfiretime 150
range 8192
muzzleEffect emplaced/muzzle_flash
}
// WP_BOT_LASER
{
weapontype WP_BOT_LASER
weaponclass weapon_bryar_pistol
weaponmodel models/weapons2/noweap/noweap.md3
//flashsound sound/weapons/probe/fire.wav
//altflashsound sound/weapons/probe/alt_fire.wav
altenergypershot 0
altrange 8192
missileFuncName bryar_func
ammotype 1
ammolowcount 15
energypershot 2
firetime 1600
range 8192
}
// WP_MELEE
{
weapontype WP_MELEE
weaponclass weapon_melee
weaponmodel models/weapons2/noweap/noweap.md3
ammotype 3
ammolowcount 5
energypershot 0
firetime 1000
range 1024
}
// WP_ATST_MAIN
{
weapontype WP_ATST_MAIN
weaponclass weapon_atst_main
weaponmodel models/weapons2/noweap/noweap.md3
weaponIcon gfx/hud/w_icon_atst
//flashsound sound/weapons/atst/ATSTfire1.wav
//altflashsound sound/weapons/atst/ATSTfire2.wav
altenergypershot 1
altrange 8192
missileFuncName atstmain_func
altmissileFuncName atstmain_func
ammotype 6
ammolowcount 15
energypershot 1
firetime 200
altfiretime 150
range 8192
muzzleEffect emplaced/muzzle_flash
}
// WP_ATST_SIDE
{
weapontype WP_ATST_SIDE
weaponclass weapon_atst_side
weaponmodel models/weapons2/noweap/noweap.md3
weaponIcon gfx/hud/w_icon_atstside
//flashsound sound/weapons/atst/ATSTfire3.wav
//altflashsound sound/weapons/atst/ATSTfire4.wav
altenergypershot 1
altrange 8192
altmissileModel models/weapons2/merr_sonn/projectile.md3
missileFuncName atst_side_main_func
altmissileFuncName atst_side_alt_func
muzzleEffect emplaced/muzzle_flash
altmuzzleEffect emplaced/muzzle_flash
ammotype 6
ammolowcount 15
energypershot 1
firetime 400
altfiretime 1000
range 8192
}
// WP_TIE_FIGHTER
{
weapontype WP_TIE_FIGHTER
weaponclass weapon_tie_fighter
weaponmodel models/weapons2/noweap/noweap.md3
weaponIcon icons/w_icon_tie
//flashsound sound/weapons/tie_fighter/tie_fire.wav
//altflashsound sound/weapons/tie_fighter/tie_fire2.wav
altenergypershot 1
altrange 8192
missileFuncName emplaced_func
altmissileFuncName emplaced_func
ammotype 6
ammolowcount 15
energypershot 1
firetime 400
altfiretime 400
range 8192
muzzleEffect emplaced/muzzle_flash
}
// WP_RAPID_FIRE_CONC
{
weapontype WP_RAPID_FIRE_CONC
weaponclass weapon_radid_concussion
weaponmodel models/weapons2/noweap/noweap.md3
weaponIcon icons/w_icon_tie
//flashsound sound/weapons/rapid_conc/fire.wav
//altflashsound sound/weapons/rapid_conc/alt_fire.wav
altenergypershot 1
altrange 8192
missileFuncName emplaced_func
altmissileFuncName repeater_alt_func
ammotype 6
ammolowcount 15
energypershot 1
firetime 400
altfiretime 1000
range 8192
muzzleEffect emplaced/muzzle_flash
}
// WP_BLASTER_PISTOL
{
weapontype WP_BLASTER_PISTOL
weaponclass weapon_blaster_pistol
weaponmodel models/weapons2/imp_pistol/pistol.md3
//flashsound sound/weapons/npc_blaster/fire.wav
//altflashsound sound/weapons/npc_blaster/alt_fire.wav
missileFuncName bryar_func
altmissileFuncName bryar_alt_func
ammotype 2
ammolowcount 15
energypershot 2
firetime 400
range 8192
altenergypershot 2
altfiretime 400
altrange 8192
muzzleEffect bryar/muzzle_flash
}
// WP_TURRET
{
weapontype WP_TURRET
weaponclass weapon_turret
weaponmodel models/weapons2/noweap/noweap.md3
weaponIcon icons/w_icon_turret
altenergypershot 1
altrange 8192
missileFuncName turret_func
ammotype 6
ammolowcount 15
energypershot 1
firetime 400
altfiretime 400
range 8192
muzzleEffect turret/muzzle_flash
}
// AMMO_NONE
{
AMMOTYPE AMMO_NONE
}
// AMMO_FORCE
{
AMMO AMMO_FORCE
AMMOMAX 100
}
// AMMO_BLASTER
{
AMMO AMMO_BLASTER
AMMOMAX 300
}
// AMMO_POWERCELL
{
AMMO AMMO_POWERCELL
AMMOMAX 300
}
// AMMO_METAL_BOLTS
{
AMMO AMMO_METAL_BOLTS
AMMOMAX 400
}
// AMMO_ROCKETS
{
AMMO AMMO_ROCKETS
AMMOMAX 10
}
// AMMO_EMPLACED
{
AMMO AMMO_EMPLACED
AMMOMAX 999
}
// AMMO_THERMAL
{
AMMO AMMO_THERMAL
AMMOMAX 10
}
// AMMO_TRIPMINE
{
AMMO AMMO_TRIPMINE
AMMOMAX 5
}
// AMMO_DETPACK
{
AMMO AMMO_DETPACK
AMMOMAX 5
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 275 KiB