Merge branch 'main' into contributions
|
@ -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"/>
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
QuatToYawPitchRoll(pWeapon->Pose.orientation, rotation, vr.weaponangles[ANGLES_SABER]);
|
||||
QuatToYawPitchRoll(pOff->Pose.orientation, rotation, vr.offhandangles[ANGLES_SABER]);
|
||||
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,16 +447,16 @@ 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);
|
||||
|
||||
///Weapon location relative to view
|
||||
VectorSet(vr.weaponoffset, pWeapon->Pose.position.x,
|
||||
pWeapon->Pose.position.y, pWeapon->Pose.position.z);
|
||||
VectorSubtract(vr.weaponoffset, vr.hmdposition, vr.weaponoffset);
|
||||
vr.weaponoffset_timestamp = Sys_Milliseconds();
|
||||
}
|
||||
VectorSet(vr.weaponposition, pWeapon->Pose.position.x,
|
||||
pWeapon->Pose.position.y, pWeapon->Pose.position.z);
|
||||
|
||||
///Weapon location relative to view
|
||||
VectorSet(vr.weaponoffset, pWeapon->Pose.position.x,
|
||||
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
|
||||
|
|
53
Projects/Android/jni/JKXR/VrTBDC.h
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -4780,12 +4781,14 @@ Ghoul2 Insert End
|
|||
CG_DoSaber( org_, axis_[0], length, client->ps.saberLengthMax, saberColor, renderfx );
|
||||
|
||||
if (CG_getPlayer1stPersonSaber(cent) &&
|
||||
cent->gent->client->ps.saberEventFlags & (SEF_BLOCKED|SEF_PARRIED) &&
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
addTime = weaponData[pm->ps->weapon].fireTime;
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -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,9 +127,15 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire )
|
|||
|
||||
if ( alt_fire )
|
||||
{
|
||||
// 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;
|
||||
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
|
||||
{
|
||||
|
@ -138,10 +150,18 @@ void WP_FireBlaster( gentity_t *ent, qboolean alt_fire )
|
|||
}
|
||||
else
|
||||
{
|
||||
if (vr->cgzoommode != 4) { // much more accurate if using the scope
|
||||
// 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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
vel = BOWCASTER_VELOCITY * ( Q_flrand(-1.0f, 1.0f) * BOWCASTER_VEL_RANGE + 1.0f );
|
||||
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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
Before Width: | Height: | Size: 460 KiB |
BIN
assets/JKXRGithub.jpg
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
assets/PatreonBanner.jpg
Normal file
After Width: | Height: | Size: 584 KiB |
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 275 KiB |
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 275 KiB |