Files
astromaddie--lambda1-vr/java/com/drbeef/lambda1vr/GLES3JNIActivity.java
T
Madison 247d8be660 Keep the game data in Documents on the Frame
On the Quest the data is in /sdcard/xash. On the Frame that would be gone
whenever the Android container gets reset, so it uses
/sdcard/Documents/Lambda1VR there, which is the headset's own
~/Documents/Lambda1VR. The Java side, the chdir and the engine's
default path all follow it. The Quest path is the same as before.

The container on the Frame has no settings page for the all files
permission, so on that build we just check we can write to the folder
and only ask if we can't (and don't fall over if there's no page).
2026-10-04 18:44:21 +09:00

665 lines
25 KiB
Java

package com.drbeef.lambda1vr;
import static android.system.Os.setenv;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.view.KeyEvent;
import static android.system.Os.setenv;
@SuppressLint("SdCardPath") public class GLES3JNIActivity extends Activity implements SurfaceHolder.Callback
{
private static String manufacturer = "";
static
{
manufacturer = Build.MANUFACTURER.toLowerCase(Locale.ROOT);
if (manufacturer.contains("oculus")) // rename oculus to meta as this will probably happen in the future anyway
{
manufacturer = "meta";
}
if (BuildConfig.STEAM_FRAME)
{
//The Frame has no loader broker, so the Khronos loader is in the APK
System.loadLibrary("openxr_loader");
try
{
setenv("OPENXR_HMD", "steamframe", true);
} catch (Exception e)
{}
}
else
{
try
{
//Load manufacturer specific loader
System.loadLibrary("openxr_loader_" + manufacturer);
setenv("OPENXR_HMD", manufacturer, true);
} catch (Exception e)
{}
}
System.loadLibrary( "xash" );
}
private static final String TAG = "Lambda1VR";
//Where the game data lives. On the Frame it's in Documents, which is the
//headset's own folder and survives a reset of the Android container.
private static final String DATA_DIR = BuildConfig.STEAM_FRAME ? "/sdcard/Documents/Lambda1VR/" : "/sdcard/xash/";
private static final int REQUEST_MANAGE_ALL_FILES = 2296;
String commandLineParams;
private SurfaceView mView;
private SurfaceHolder mSurfaceHolder;
private long mNativeHandle;
public void shutdown() {
System.exit(0);
}
@Override protected void onCreate( Bundle icicle )
{
Log.v( TAG, "----------------------------------------------------------------" );
Log.v( TAG, "GLES3JNIActivity::onCreate()" );
super.onCreate( icicle );
mView = new SurfaceView( this );
setContentView( mView );
mView.getHolder().addCallback( this );
checkPermissionsAndInitialize();
}
/** Initializes the Activity only if the permission has been granted. */
private boolean canUseStorage() {
if (Environment.isExternalStorageManager()) {
return true;
}
if (BuildConfig.STEAM_FRAME) {
//The container on the Frame has no settings page for this, and the folder is
//plain files from the host, so all that matters is if we can write to it
File dir = new File(DATA_DIR);
return (dir.isDirectory() || dir.mkdirs()) && dir.canWrite();
}
return false;
}
private void checkPermissionsAndInitialize() {
if (!canUseStorage()) {
//request for the permission
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
try {
startActivityForResult(intent, REQUEST_MANAGE_ALL_FILES);
} catch (ActivityNotFoundException e) {
Log.e(TAG, "No settings page for the all files permission, and " + DATA_DIR + " can't be written");
}
finishAffinity(); // Cleanly exit
}
else
{
// Permissions have already been granted.
create();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
finishAffinity(); // Cleanly exit
System.exit(0);
}
public void create()
{
copy_asset(getFilesDir().getPath(), "extras.pak", false);
copy_asset(DATA_DIR, "commandline.txt", false); // Copy in case user has deleted their config
//Read these from a file and pass through
commandLineParams = new String("xash3d -dev 3 -log");
//See if user is trying to use command line params
if(new File(DATA_DIR + "commandline.txt").exists()) // should exist!
{
BufferedReader br;
try {
br = new BufferedReader(new FileReader(DATA_DIR + "commandline.txt"));
String s;
StringBuilder sb=new StringBuilder(0);
while ((s=br.readLine())!=null)
sb.append(s + " ");
br.close();
commandLineParams = new String(sb.toString());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String[] params = commandLineParams.split(" ");
String game = "valve";
int i = 0;
for (i = 0; i < params.length; ++i)
{
if (params[i].compareTo("-game") == 0)
{
game = params[i+1];
}
}
//game configuration
copy_asset(DATA_DIR + game + "/", "config.cfg", false); // Copy in case user has deleted their config
//special commands
copy_asset(DATA_DIR + game + "/", "commands.lst", false); // Copy in case user has deleted their config
//Copy our special stuff
copy_asset(DATA_DIR + game + "/", "sprites/s_stealth.spr", true);
copy_asset(DATA_DIR + game + "/", "sprites/vignette.tga", true);
copy_asset(DATA_DIR + "valve/", "sprites/vignette.tga", true); //seems to need to be here for some people
//Menu Arrow
copy_asset(DATA_DIR + game + "/", "sprites/pointer.tga", true);
copy_asset(DATA_DIR + "valve/", "sprites/pointer.tga", true);
//Menu Background
copy_asset(DATA_DIR + "valve/resource/", "background/800_1_a_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_1_b_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_1_c_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_1_d_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_2_a_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_2_b_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_2_c_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_2_d_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_3_a_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_3_b_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_3_c_loading.tga", true);
copy_asset(DATA_DIR + "valve/resource/", "background/800_3_d_loading.tga", true);
//Copy modified weapon models - This is the base set
if (!(new File(DATA_DIR + game + "/models/no_copy").exists()) && !(game.equalsIgnoreCase("Hunger")))
{
//Colt (A-16)
copy_asset(DATA_DIR + game + "/", "models/v_9mmar.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_9mmar.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_9mmar.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/items/clipinsert1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/items/cliprelease1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/t_m4_boltpull.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/t_m4_deploy.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/t_m4_m203_in.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/t_m4_m203_out.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/t_m4_m203_shell.wav", true);
//Colt Pistol M1911
copy_asset(DATA_DIR + game + "/", "models/v_9mmhandgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_9mmhandgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_9mmhandgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/glock_magin.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/glock_magout.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/glock_slideforward.wav", true);
//357 Python
copy_asset(DATA_DIR + game + "/", "models/v_357.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_357.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_357.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/357_shot1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/357_shot2.wav", true);
//RGD Grenade
copy_asset(DATA_DIR + game + "/", "models/v_grenade.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_grenade.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_grenade.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/grenade_pinpull.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/grenade_throw.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/grenade_draw.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/explode3.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/explode4.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/explode5.wav", true);
//Shotgun Benelli M3
copy_asset(DATA_DIR + game + "/", "models/v_shotgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_shotgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_shotgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/m3_insertshell.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/m3_pump.wav", true);
//Stalker Rocket
copy_asset(DATA_DIR + game + "/", "models/v_rpg.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_rpg.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_rpg.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/rpgrocket.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/v_rpgammo.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/rocket1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/rocketfire1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/rpg7_reload.wav", true);
//Satchel
copy_asset(DATA_DIR + game + "/", "models/v_satchel.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/v_satchel_radio.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_satchel.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_satchel.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_satchel_radio.mdl", true);
//Tripmine
copy_asset(DATA_DIR + game + "/", "models/v_tripmine.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_tripmine.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/mine_activate.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/mine_deploy.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/tripmine_ant.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/tripmine_button.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/tripmine_move.wav", true);
//BMS Crossbow
copy_asset(DATA_DIR + game + "/", "models/v_crossbow.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_crossbow.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_crossbow.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_crossbow_clip.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/natianul.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/xbow.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/xbow_fire1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/xbow_reload1.wav", true);
//Egon (Overhaul)
copy_asset(DATA_DIR + game + "/", "models/v_egon.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_egon.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_egon.mdl", true);
//Gauss (Overhaul)
copy_asset(DATA_DIR + game + "/", "models/v_gauss.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_gauss.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_gauss.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_gaussammo.mdl", true);
//HGun (Overhaul)
copy_asset(DATA_DIR + game + "/", "models/v_hgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_hgun.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_hgun.mdl", true);
//Squeak (Overhaul)
copy_asset(DATA_DIR + game + "/", "models/v_squeak.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/p_squeak.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_squeak.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_sqknest.mdl", true);
//Crowbar
copy_asset(DATA_DIR + game + "/", "models/v_crowbar.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/w_crowbar.mdl", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_draw.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_hit1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_hit2.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_hitbod1.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_hitbod2.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_hitbod3.wav", true);
copy_asset(DATA_DIR + game + "/", "sound/weapons/cbar_miss1.wav", true);
copy_asset(DATA_DIR + game + "/", "models/v_torch.mdl", true);
copy_asset(DATA_DIR + game + "/", "models/v_hand.mdl", true);
}
//Copy Opposing Force specific models
if (game.equalsIgnoreCase("gearbox") &&
!(new File(DATA_DIR + game + "/models/no_copy").exists()))
{
//Scope vignette texture
copy_asset(DATA_DIR + game + "/", "sprites/scope.tga", true);
copy_asset(DATA_DIR + "valve/", "sprites/scope.tga", true);
//Sniper Rifle
copy_asset(DATA_DIR, "gearbox/models/v_m40a1.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_m40a1.mdl", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/scout_clipin.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/scout_clipout.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/sniper_fire.wav", true);
//Pipe Wrench
copy_asset(DATA_DIR, "gearbox/models/v_pipe_wrench.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_pipe_wrench.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/p_pipe_wrench.mdl", true);
//Penguins
new File(DATA_DIR + "gearbox/sound/penguin/").mkdirs(); // Make the penguin directory as it won't exist
copy_asset(DATA_DIR, "gearbox/sound/penguin/penguin_die1.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/penguin/penguin_deploy1.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/penguin/penguin_hunt1.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/penguin/penguin_hunt2.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/penguin/penguin_hunt3.wav", true);
//Knife
copy_asset(DATA_DIR, "gearbox/models/v_knife.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_knife.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/p_knife.mdl", true);
//Desert Eagle
copy_asset(DATA_DIR, "gearbox/models/v_desert_eagle.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_desert_eagle.mdl", true);
//Saw
copy_asset(DATA_DIR, "gearbox/models/v_saw.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/p_saw.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_saw.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_saw_clip.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/saw_link.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/saw_shell.mdl", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/SAW_bolt.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/saw_fire1.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/saw_fire2.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/saw_fire3.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/saw_reload_new.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/saw_reload2_new.wav", true);
//Barnacle
copy_asset(DATA_DIR, "gearbox/models/v_bgrap.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/p_bgrap.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_bgrap.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/v_bgrap_tonguetip.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/saw_link.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/saw_shell.mdl", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/bgrapple_cough.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/bgrapple_fire.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/bgrapple_impact.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/bgrapple_pull.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/bgrapple_release.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/bgrapple_wait.wav", true);
//Shock
copy_asset(DATA_DIR, "gearbox/models/v_shock.mdl", true);
//Pingu
copy_asset(DATA_DIR, "gearbox/models/v_penguin.mdl", true);
//Spore
copy_asset(DATA_DIR, "gearbox/models/v_spore_launcher.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_spore_launcher.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/spore.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/spore_ammo.mdl", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/splauncher_bounce.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/splauncher_impact.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/spore_hit1.wav", true);
//Displacer
copy_asset(DATA_DIR, "gearbox/models/v_displacer.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/w_displacer.mdl", true);
copy_asset(DATA_DIR, "gearbox/models/p_displacer.mdl", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_fire.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_impact.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_self.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_spin.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_spin2.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_start.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_teleport.wav", true);
copy_asset(DATA_DIR, "gearbox/sound/weapons/displacer_teleport_player.wav", true);
//Hand
copy_asset(DATA_DIR, "gearbox/models/v_hand.mdl", true);
}
//Copy Blue Shift specific models
if (game.equalsIgnoreCase("bshift") &&
!(new File(DATA_DIR + game + "/models/no_copy").exists()))
{
copy_asset(DATA_DIR, "bshift/models/v_hand.mdl", true);
}
//Copy They Hunger specific models
if (game.equalsIgnoreCase("Hunger") &&
!(new File(DATA_DIR + game + "/models/no_copy").exists()))
{
//HL1 models
copy_asset(DATA_DIR + game + "/", "/models/v_rpg.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_357.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_satchel.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_satchel_radio.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_tripmine.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_crossbow.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_gauss.mdl", true);
copy_asset(DATA_DIR + game + "/", "/models/v_squeak.mdl", true);
//They Hunger models
copy_asset(DATA_DIR, "Hunger/models/v_9mmar.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_9mmhandgun.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_ap9.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_crowbar.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_egon.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_hkg36.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_shotgun.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_shovel.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_taurus.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_tfac.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_tfc_medkit.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_tfc_sniper.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_tfc_spanner.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_tnt.mdl", true);
copy_asset(DATA_DIR, "Hunger/models/v_hand.mdl", true);
}
//Copy Afraid of Monsters Director's Cut specific models
if (game.equalsIgnoreCase("AoMDC") &&
!(new File(DATA_DIR + game + "/models/no_copy").exists()))
{
//Afraid of Monsters Director's Cut models
copy_asset(DATA_DIR, "AoMDC/models/v_axe.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_beretta.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_deagle.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_glock.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_hammer.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_hand.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_kitchenknife.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_mp5k.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_p228.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_revolver.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_shotgun.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_spear.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_torch.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/v_uzi.mdl", true);
copy_asset(DATA_DIR, "AoMDC/models/gmgeneral_display.aomdc", true);
}
//Set default environment
try {
ApplicationInfo info = getApplicationInfo();
setenv("XASH3D_BASEDIR", DATA_DIR, true);
setenv("XASH3D_GAMELIBDIR", info.nativeLibraryDir, true);
setenv("XASH3D_GAMEDIR", "valve", true);
setenv( "XASH3D_EXTRAS_PAK1", getFilesDir().getPath() + "/extras.pak", true );
//If game is gearbox (Opposing Force) set the library file suffix to opfor
if (game.equalsIgnoreCase("gearbox"))
{
setenv("XASH3D_LIBSUFFIX", "_opfor", true);
//Use pipewrench as backpack weapon in opposing force
setenv("VR_BACKPACK_WEAPON", "weapon_pipewrench", true);
}
else if (game.equalsIgnoreCase("bshift"))
{
setenv("XASH3D_LIBSUFFIX", "_bshift", true);
}
else if (game.equalsIgnoreCase("aomdc"))
{
setenv("XASH3D_LIBSUFFIX", "_aomdc", true);
}
else if (game.equalsIgnoreCase("hunger"))
{
setenv("XASH3D_LIBSUFFIX", "_theyhunger", true);
}
else
{
setenv("XASH3D_LIBSUFFIX", "", true);
}
}
catch (Exception e)
{
}
mNativeHandle = GLES3JNILib.onCreate( this, commandLineParams );
}
public void copy_asset(String path, String name, boolean forceOverwrite) {
File f = new File(path + "/" + name);
if (!f.exists() || forceOverwrite) {
//Ensure we have an appropriate folder
new File(path).mkdirs();
_copy_asset(name, path + "/" + name);
}
}
public void _copy_asset(String name_in, String name_out) {
AssetManager assets = this.getAssets();
try {
InputStream in = assets.open(name_in);
OutputStream out = new FileOutputStream(name_out);
copy_stream(in, out);
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void copy_stream(InputStream in, OutputStream out)
throws IOException {
byte[] buf = new byte[1024];
while (true) {
int count = in.read(buf);
if (count <= 0)
break;
out.write(buf, 0, count);
}
}
@Override protected void onStart()
{
Log.v( TAG, "GLES3JNIActivity::onStart()" );
super.onStart();
GLES3JNILib.onStart( mNativeHandle, this );
}
@Override protected void onResume()
{
Log.v( TAG, "GLES3JNIActivity::onResume()" );
super.onResume();
GLES3JNILib.onResume( mNativeHandle );
}
@Override protected void onPause()
{
Log.v( TAG, "GLES3JNIActivity::onPause()" );
GLES3JNILib.onPause( mNativeHandle );
super.onPause();
}
@Override protected void onStop()
{
Log.v( TAG, "GLES3JNIActivity::onStop()" );
GLES3JNILib.onStop( mNativeHandle );
super.onStop();
}
@Override protected void onDestroy()
{
Log.v( TAG, "GLES3JNIActivity::onDestroy()" );
if ( mSurfaceHolder != null )
{
GLES3JNILib.onSurfaceDestroyed( mNativeHandle );
}
GLES3JNILib.onDestroy( mNativeHandle );
super.onDestroy();
mNativeHandle = 0;
}
@Override public void surfaceCreated( SurfaceHolder holder )
{
Log.v( TAG, "GLES3JNIActivity::surfaceCreated()" );
if ( mNativeHandle != 0 )
{
GLES3JNILib.onSurfaceCreated( mNativeHandle, holder.getSurface() );
mSurfaceHolder = holder;
}
}
@Override public void surfaceChanged( SurfaceHolder holder, int format, int width, int height )
{
Log.v( TAG, "GLES3JNIActivity::surfaceChanged()" );
if ( mNativeHandle != 0 )
{
GLES3JNILib.onSurfaceChanged( mNativeHandle, holder.getSurface() );
mSurfaceHolder = holder;
}
}
@Override public void surfaceDestroyed( SurfaceHolder holder )
{
Log.v( TAG, "GLES3JNIActivity::surfaceDestroyed()" );
if ( mNativeHandle != 0 )
{
GLES3JNILib.onSurfaceDestroyed( mNativeHandle );
mSurfaceHolder = null;
}
}
}