Files
astromaddie--lambda1-vr/java/com/drbeef/lambda1vr/GLES3JNIActivity.java
T
Madison a4f12f84fd Frame: use Half-Life from Steam where it is, read only
The Android container on the Frame shows the headset's Steam folders at the
same paths, read only. At start the app looks for steamapps/common/Half-Life
(valve/liblist.gam) in the Steam library and in the other libraries
libraryfolders.vdf lists, and gives the engine that folder as XASH3D_RODIR.
The engine searches it after the writable folder, so the saves, the
settings and the files this app puts in /sdcard/Documents/Lambda1VR (the
replacement models and sprites) win over Steam's. Nothing is written into the
Steam folder. If there's no Half-Life there, a copy in Documents is used as
before, and a [data] line in the log says which one it was.

Builds. Haven't tried it on the headset yet.
2026-10-04 23:38:22 +09:00

728 lines
27 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);
}
/**
* The Frame's Android container shows the headset's Steam folders at the same paths, read only. If
* Half-Life is installed there, the game's files can be used from where they are instead of a copy.
* Looks in the Steam library folders (the main one, and the others libraryfolders.vdf lists, such as
* one on an SD card) for steamapps/common/Half-Life/valve/liblist.gam. Returns the Half-Life folder or null.
*/
private String findSteamHalfLife()
{
final String steam = "/home/steamos/.local/share/Steam";
java.util.ArrayList<String> libraries = new java.util.ArrayList<String>();
libraries.add(steam);
try
{
BufferedReader br = new BufferedReader(new FileReader(steam + "/steamapps/libraryfolders.vdf"));
String line;
while ((line = br.readLine()) != null)
{
// "path" "/some/library"
line = line.trim();
if (line.startsWith("\"path\""))
{
String[] parts = line.split("\"");
if (parts.length >= 4 && !libraries.contains(parts[3]))
{
libraries.add(parts[3]);
}
}
}
br.close();
} catch (IOException e)
{
Log.i(TAG, "[data] no libraryfolders.vdf: " + e.getMessage());
}
for (String library : libraries)
{
File liblist = new File(library + "/steamapps/common/Half-Life/valve/liblist.gam");
if (liblist.canRead())
{
return library + "/steamapps/common/Half-Life";
}
Log.i(TAG, "[data] no Half-Life in the Steam library " + library);
}
return null;
}
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);
if (BuildConfig.STEAM_FRAME)
{
// Half-Life from Steam, read only, in place. The folder above is searched after it, so what's
// in there (the saves, the settings, this app's own models and sprites) wins over Steam's files.
String steamHalfLife = findSteamHalfLife();
if (steamHalfLife != null)
{
setenv("XASH3D_RODIR", steamHalfLife, true);
Log.i(TAG, "[data] game files: Steam, in place, read only (" + steamHalfLife + "); saves and settings in " + DATA_DIR);
}
else
{
Log.i(TAG, "[data] game files: no Steam install of Half-Life found, using the copy in " + DATA_DIR);
}
}
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;
}
}
}