mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2026-04-19 17:17:04 -04:00
Merge branch 'v3_openjdk' into v3_zink
This commit is contained in:
97
README.md
97
README.md
@@ -1,41 +1,63 @@
|
||||
<H1 align="center">PojavLauncher</H1>
|
||||
|
||||
<img src="https://github.com/CriticalRange/PojavLauncher/blob/v3_openjdk/app_pojavlauncher/src/main/assets/pojavlauncher.png" align="left" width="130" height="150" alt="PojavLauncher logo">
|
||||
|
||||
[](https://github.com/PojavLauncherTeam/PojavLauncher/actions)
|
||||
[](https://github.com/PojavLauncherTeam/PojavLauncher/actions)
|
||||
[](https://crowdin.com/project/pojavlauncher)
|
||||
[](https://discord.gg/6RpEJda)
|
||||
[](https://reddit.com/r/PojavLauncher)
|
||||
[](https://play.google.com/store/apps/details?id=net.kdt.pojavlaunch)
|
||||
[](https://discord.gg/6RpEJda)
|
||||
[](https://twitter.com/PLaunchTeam)
|
||||
---------
|
||||
* From [Boardwalk](https://github.com/zhuowei/Boardwalk)'s ashes here comes PojavLauncher!
|
||||
|
||||
# PojavLauncher
|
||||
* PojavLauncher is a launcher that allows you to play Minecraft:Java Edition on your Android device!
|
||||
|
||||
## Note
|
||||
* It can run almost every version of the Minecraft, allowing you to use .jar only installers to install modloaders like [forge](https://files.minecraftforge.net/), [fabric](http://fabricmc.net/), [optifine](https://optifine.net); hack clients like LabyMod and much more!
|
||||
|
||||
* For more details [check out our wiki](https://github.com/PojavLauncherTeam/PojavLauncher/wiki)
|
||||
## Some notes to start with
|
||||
- We do not exist on TikTok. No one from the dev team makes TikTok videos.
|
||||
- The official Twitter for PojavLauncher is [@PLaunchTeam](https://twitter.com/PLaunchTeam). Any others (most notably @PojavLauncher) are fake, please report them to Twitter's moderation team.
|
||||
|
||||
## Navigation
|
||||
- [Introduction](#introduction)
|
||||
- [Getting PojavLauncher](#getting-pojavlauncher)
|
||||
- [Building](#building)
|
||||
- [Current status](#current-status)
|
||||
- [License](#license)
|
||||
- [Contributing](#contributing)
|
||||
- [Credits & Third party components and their licenses](#credits--third-party-components-and-their-licenses)
|
||||
- [Credits & Third party components and their licenses](#credits--third-party-components-and-their-licenses-if-available)
|
||||
|
||||
## Introduction
|
||||
PojavLauncher is a Minecraft: Java Edition launcher for Android and iOS based on [Boardwalk](https://github.com/zhuowei/Boardwalk). This launcher can launch almost all available Minecraft versions (from rd-132211 to 1.18 snapshots (kinda)), including Combat Test versions. Modding via Forge (up to 1.16.5) and Fabric are also supported. This repository contains source code for Android. For iOS/iPadOS, check out [PojavLauncher_iOS](https://github.com/PojavLauncherTeam/PojavLauncher_iOS).
|
||||
* PojavLauncher is a Minecraft: Java Edition launcher for Android and iOS based on [Boardwalk](https://github.com/zhuowei/Boardwalk).
|
||||
* This launcher can launch almost all available Minecraft versions ranging from rd-132211 to 1.19 snapshots (including Combat Test versions).
|
||||
* Modding via Forge and Fabric are also supported.
|
||||
* This repository contains source code for Android.
|
||||
* For iOS/iPadOS, check out [PojavLauncher_iOS](https://github.com/PojavLauncherTeam/PojavLauncher_iOS).
|
||||
|
||||
## Getting PojavLauncher
|
||||
|
||||
Getting PojavLauncher is divided into 3 parts.
|
||||
|
||||
1. You can get prebuilt app from [stable releases](https://github.com/PojavLauncherTeam/PojavLauncher/releases) or [automatic builds](https://github.com/PojavLauncherTeam/PojavLauncher/actions).
|
||||
|
||||
2. You can get it from Google Play by clicking:
|
||||
[](https://play.google.com/store/apps/details?id=net.kdt.pojavlaunch)
|
||||
|
||||
3. You can [build](#building) from source.
|
||||
## Building
|
||||
To get started, you can just get prebuilt app from [stable release](https://github.com/PojavLauncherTeam/PojavLauncher/releases) or [automatic builds](https://github.com/PojavLauncherTeam/PojavLauncher/actions). If you want to build after launcher code changes, follow steps below.
|
||||
|
||||
Will be moved to **BUILDING.md**
|
||||
If you want to build after launcher code changes, follow the steps below.
|
||||
### Java Runtime Environment (JRE)
|
||||
- JRE for Android is [here](https://github.com/PojavLauncherTeam/openjdk-multiarch-jdk8u), also the build script [here](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch).
|
||||
- JRE for Android is [here](https://github.com/PojavLauncherTeam/openjdk-multiarch-jdk8u), and the build script is [here](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch).
|
||||
- Follow build instruction on build script [README.md](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/blob/buildjre8/README.md).
|
||||
- You can also get [CI auto builds](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/actions).
|
||||
- Either get `jre8-pojav` artifact from auto builds, or do splitting by yourself:</br>
|
||||
- Get JREs for all of 4 supported architectures (arm, arm64, x86, x86_64) </br>
|
||||
- Split JRE into parts:</br>
|
||||
- You can also get [CI auto builds](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/actions) if you are lazy or failing it for some reason.
|
||||
* Either get `jre8-pojav` artifact from auto builds, or do splitting by yourself:</br>
|
||||
- Get JREs for all of 4 supported architectures (arm, arm64, x86, x86_64) </br>
|
||||
- Split JRE into parts:</br>
|
||||
Platform-independent: .jar files, libraries, configs, etc...</br>
|
||||
Platform-dependent: .so files, etc...</br>
|
||||
- Create:</br>
|
||||
file named `universal.tar.xz` with all platform-independent files</br>
|
||||
A file named `universal.tar.xz` with all platform-independent files</br>
|
||||
4 files named `bin-<arch>.tar.xz` with all platform-dependent files per-architecture</br>
|
||||
- Put these in `assets/components/jre/` folder</br>
|
||||
- (If needed) update the Version file with the current date</br>
|
||||
@@ -44,21 +66,25 @@ Will be moved to **BUILDING.md**
|
||||
- **Coming soon**
|
||||
|
||||
### The Launcher
|
||||
- Because languages are auto added by Crowdin, so need to run language list generator before building. In this directory, run:
|
||||
- Because languages are auto added by Crowdin, you need to run language list generator before building. In the project directory, run:
|
||||
|
||||
* On Linux, Mac OS:
|
||||
```
|
||||
# On Linux, Mac OS:
|
||||
chmod +x scripts/languagelist_updater.sh
|
||||
bash scripts/languagelist_updater.sh
|
||||
|
||||
# On Windows:
|
||||
```
|
||||
* On Windows:
|
||||
```
|
||||
scripts\languagelist_updater.bat
|
||||
```
|
||||
- Then, run these commands ~~build use Android Studio~~.
|
||||
Then, run these commands ~~or build using Android Studio~~.
|
||||
|
||||
* Build GLFW stub:
|
||||
```
|
||||
# Build GLFW stub
|
||||
./gradlew :jre_lwjgl3glfw:build
|
||||
|
||||
# Build the launcher
|
||||
```
|
||||
* Build the launcher
|
||||
```
|
||||
./gradlew :app_pojavlauncher:assembleDebug
|
||||
```
|
||||
(Replace `gradlew` to `gradlew.bat` if you are building on Windows).
|
||||
@@ -66,32 +92,33 @@ scripts\languagelist_updater.bat
|
||||
## Current status
|
||||
- [x] ~~OpenJDK 9 Mobile port: ARM32, ARM64, x86, x86_64.~~ Replaced by JRE8.
|
||||
- [x] OpenJDK 8 Mobile port: ARM32, ARM64, x86, x86_64
|
||||
- [x] OpenJDK 17 Mobile port: ARM32, ARM64, x86, x86_64
|
||||
- [x] Mod installer headless
|
||||
- [x] Mod installer with GUI. Used `Caciocavallo` project for AWT without X11.
|
||||
- [x] OpenGL in OpenJDK environment
|
||||
- [x] OpenAL (work on most devices)
|
||||
- [x] Support Minecraft 1.12.2 and below. Used [lwjglx](https://github.com/PojavLauncherTeam/lwjglx), a LWJGL2 compatibility layer for LWJGL3.
|
||||
- [x] Support Minecraft 1.13 and above. Used [GLFW stub](https://github.com/PojavLauncherTeam/lwjgl3-glfw-java).
|
||||
- [x] OpenAL (works on most devices)
|
||||
- [x] Support for Minecraft 1.12.2 and below. Used [lwjglx](https://github.com/PojavLauncherTeam/lwjglx), a LWJGL2 compatibility layer for LWJGL3.
|
||||
- [x] Support for Minecraft 1.13 and above. Used [GLFW stub](https://github.com/PojavLauncherTeam/lwjgl3-glfw-java).
|
||||
- [x] Support for Minecraft 1.17 (22w13a to be exact) and above. Used [Holy GL4ES](https://github.com/PojavLauncherTeam/gl4es-114-extra)
|
||||
- [x] Game surface zooming.
|
||||
- [x] New input pipe rewritten to native code to boost performance.
|
||||
- [ ] More...
|
||||
- [x] Rewritten entire controls system (thanks to @Mathias-Boulay)
|
||||
- [ ] More to come!
|
||||
|
||||
## Known Issues
|
||||
- Minecraft `21w10a` or newer are currently not yet supported due to the new GLSL usage. Fortunately, a workaround is provided and built into the launcher.
|
||||
- In 1.16 and up, spawn eggs banners are white (you can fix this by switching renderer
|
||||
to `gl4es 1.1.5`, only works on 1.16 and up, do not use under this version, as the texture
|
||||
will bug out when hit a mob)
|
||||
- Controller mods aren't working.
|
||||
- Random crashes could happen very often on Android 5.x during game load or join world.
|
||||
- With big modpacks textures could be messed up
|
||||
- probably more, that's why we have a bug tracker ;)
|
||||
- Probably more, that's why we have a bug tracker ;)
|
||||
|
||||
## License
|
||||
- PojavLauncher is licensed under [GNU GPLv3](https://github.com/khanhduytran0/PojavLauncher/blob/master/LICENSE).
|
||||
|
||||
## Contributing
|
||||
Contributions are welcome! We welcome any type of contribution, not only code.
|
||||
Any code change should be submitted as a pull request. The description should explain what the code does and give steps to execute it.
|
||||
Contributions are welcome! We welcome any type of contribution, not only code. For example, you can help the wiki shape up. You can help the [translation](https://crowdin.com/project/pojavlauncher) too!
|
||||
|
||||
|
||||
Any code change to this repository (or iOS) should be submitted as a pull request. The description should explain what the code does and give steps to execute it.
|
||||
|
||||
## Credits & Third party components and their licenses (if available)
|
||||
- [Boardwalk](https://github.com/zhuowei/Boardwalk) (JVM Launcher): Unknown License/[Apache License 2.0](https://github.com/zhuowei/Boardwalk/blob/master/LICENSE) or GNU GPLv2.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
20220819
|
||||
BIN
app_pojavlauncher/src/main/assets/pojavlauncher.png
Normal file
BIN
app_pojavlauncher/src/main/assets/pojavlauncher.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 526 KiB |
BIN
app_pojavlauncher/src/main/assets/pojavtext.png
Normal file
BIN
app_pojavlauncher/src/main/assets/pojavtext.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
@@ -12,8 +12,8 @@ import net.kdt.pojavlaunch.utils.*;
|
||||
import org.lwjgl.glfw.*;
|
||||
|
||||
public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {
|
||||
public static final int AWT_CANVAS_WIDTH = 600;
|
||||
public static final int AWT_CANVAS_HEIGHT = 420;
|
||||
public static final int AWT_CANVAS_WIDTH = 720;
|
||||
public static final int AWT_CANVAS_HEIGHT = 600;
|
||||
private final int MAX_SIZE = 100;
|
||||
private final double NANOS = 1000000000.0;
|
||||
|
||||
|
||||
@@ -11,14 +11,11 @@ public abstract class BaseActivity extends AppCompatActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
LocaleUtils.setLocale(this);
|
||||
Tools.setFullscreen(this);
|
||||
Tools.updateWindowSize(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(LocaleUtils.setLocale(base));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void startActivity(Intent i) {
|
||||
|
||||
@@ -233,7 +233,7 @@ public class BaseMainActivity extends BaseActivity {
|
||||
if(Tools.LOCAL_RENDERER == null) {
|
||||
Tools.LOCAL_RENDERER = LauncherPreferences.PREF_RENDERER;
|
||||
}
|
||||
Logger.getInstance().appendToLog("--------- beggining with launcher debug");
|
||||
Logger.getInstance().appendToLog("--------- beginning with launcher debug");
|
||||
Logger.getInstance().appendToLog("Info: Launcher version: " + BuildConfig.VERSION_NAME);
|
||||
if (Tools.LOCAL_RENDERER.equals("vulkan_zink")) {
|
||||
checkVulkanZinkIsSupported();
|
||||
@@ -376,7 +376,7 @@ public class BaseMainActivity extends BaseActivity {
|
||||
sendKeyPress(LwjglGlfwKeycode.GLFW_KEY_ESCAPE);
|
||||
return true;
|
||||
}
|
||||
return super.dispatchKeyEvent(event);
|
||||
return minecraftGLView.processKeyEvent(event);
|
||||
}
|
||||
|
||||
public static void switchKeyboardState() {
|
||||
|
||||
@@ -8,7 +8,7 @@ public class DisplayableLocale {
|
||||
private static Locale processStringLocale(String locale) {
|
||||
if (locale.contains("-")) {
|
||||
String[] split = locale.split("-");
|
||||
return new Locale(split[0], split[1]);
|
||||
return new Locale(split[0], split[1].toUpperCase());
|
||||
} else {
|
||||
return new Locale(locale);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import net.kdt.pojavlaunch.utils.FileUtils;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
@@ -122,11 +123,8 @@ public class ImportControlActivity extends Activity {
|
||||
InputStream is;
|
||||
try {
|
||||
is = getContentResolver().openInputStream(mUriData);
|
||||
|
||||
OutputStream os = new FileOutputStream(Tools.CTRLMAP_PATH + "/" + fileName + ".json");
|
||||
byte[] buffer = new byte[1024];
|
||||
while(is.read(buffer) != -1)
|
||||
os.write(buffer);
|
||||
IOUtils.copy(is, os);
|
||||
|
||||
os.close();
|
||||
is.close();
|
||||
|
||||
@@ -117,13 +117,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||
});
|
||||
|
||||
try {
|
||||
JREUtils.jreReleaseList = JREUtils.readJREReleaseProperties(LauncherPreferences.PREF_DEFAULT_RUNTIME);
|
||||
if (JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0")) {
|
||||
MultiRTUtils.setRuntimeNamed(this,LauncherPreferences.PREF_DEFAULT_RUNTIME);
|
||||
} else {
|
||||
MultiRTUtils.setRuntimeNamed(this,MultiRTUtils.getExactJreName(8));
|
||||
JREUtils.jreReleaseList = JREUtils.readJREReleaseProperties();
|
||||
}
|
||||
MultiRTUtils.setRuntimeNamed(this,LauncherPreferences.PREF_DEFAULT_RUNTIME);
|
||||
|
||||
placeMouseAt(CallbackBridge.physicalWidth / 2, CallbackBridge.physicalHeight / 2);
|
||||
|
||||
@@ -247,7 +241,8 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||
List<String> javaArgList = new ArrayList<String>();
|
||||
|
||||
// Enable Caciocavallo
|
||||
Tools.getCacioJavaArgs(javaArgList,false);
|
||||
JREUtils.jreReleaseList = JREUtils.readJREReleaseProperties(LauncherPreferences.PREF_DEFAULT_RUNTIME);
|
||||
Tools.getCacioJavaArgs(javaArgList,JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0"));
|
||||
|
||||
if (javaArgs != null) {
|
||||
javaArgList.addAll(Arrays.asList(javaArgs.split(" ")));
|
||||
|
||||
@@ -203,7 +203,7 @@ public class MinecraftGLSurface extends View {
|
||||
public boolean onTouchEvent(MotionEvent e) {
|
||||
// Looking for a mouse to handle, won't have an effect if no mouse exists.
|
||||
for (int i = 0; i < e.getPointerCount(); i++) {
|
||||
if (e.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE) continue;
|
||||
if(e.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE && e.getToolType(i) != MotionEvent.TOOL_TYPE_STYLUS ) continue;
|
||||
|
||||
// Mouse found
|
||||
if(CallbackBridge.isGrabbing()) return false;
|
||||
@@ -391,7 +391,7 @@ public class MinecraftGLSurface extends View {
|
||||
}
|
||||
|
||||
for(int i = 0; i < event.getPointerCount(); i++) {
|
||||
if(event.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE) continue;
|
||||
if(event.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE && event.getToolType(i) != MotionEvent.TOOL_TYPE_STYLUS ) continue;
|
||||
// Mouse found
|
||||
mouseCursorIndex = i;
|
||||
break;
|
||||
@@ -480,13 +480,11 @@ public class MinecraftGLSurface extends View {
|
||||
}
|
||||
|
||||
/** The event for keyboard/ gamepad button inputs */
|
||||
@Override
|
||||
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
|
||||
public boolean processKeyEvent(KeyEvent event) {
|
||||
//Toast.makeText(this, event.toString(),Toast.LENGTH_SHORT).show();
|
||||
//Toast.makeText(this, event.getDevice().toString(), Toast.LENGTH_SHORT).show();
|
||||
|
||||
//Filtering useless events by order of probability
|
||||
if((event.getFlags() & KeyEvent.FLAG_FALLBACK) == KeyEvent.FLAG_FALLBACK) return true;
|
||||
int eventKeycode = event.getKeyCode();
|
||||
if(eventKeycode == KeyEvent.KEYCODE_UNKNOWN) return true;
|
||||
if(eventKeycode == KeyEvent.KEYCODE_VOLUME_DOWN) return false;
|
||||
@@ -494,8 +492,6 @@ public class MinecraftGLSurface extends View {
|
||||
if(event.getRepeatCount() != 0) return true;
|
||||
if(event.getAction() == KeyEvent.ACTION_MULTIPLE) return true;
|
||||
|
||||
//Toast.makeText(this, "FIRST VERIF PASSED", Toast.LENGTH_SHORT).show();
|
||||
|
||||
//Sometimes, key events comes from SOME keys of the software keyboard
|
||||
//Even weirder, is is unknown why a key or another is selected to trigger a keyEvent
|
||||
if((event.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD){
|
||||
@@ -503,25 +499,19 @@ public class MinecraftGLSurface extends View {
|
||||
touchCharInput.dispatchKeyEvent(event);
|
||||
return true;
|
||||
}
|
||||
//Toast.makeText(this, "SECOND VERIF PASSED", Toast.LENGTH_SHORT).show();
|
||||
|
||||
|
||||
//Sometimes, key events may come from the mouse
|
||||
if(event.getDevice() != null
|
||||
&& ( (event.getSource() & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE
|
||||
|| (event.getSource() & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) ){
|
||||
//Toast.makeText(this, "THE EVENT COMES FROM A MOUSE", Toast.LENGTH_SHORT).show();
|
||||
|
||||
|
||||
if(eventKeycode == KeyEvent.KEYCODE_BACK){
|
||||
sendMouseButton(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_RIGHT, event.getAction() == KeyEvent.ACTION_DOWN);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//System.out.println(event);
|
||||
|
||||
if(Gamepad.isGamepadEvent(event)){
|
||||
|
||||
if(mGamepad == null){
|
||||
mGamepad = new Gamepad(this, event.getDevice());
|
||||
}
|
||||
@@ -537,6 +527,9 @@ public class MinecraftGLSurface extends View {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Some events will be generated an infinite number of times when no consumed
|
||||
if((event.getFlags() & KeyEvent.FLAG_FALLBACK) == KeyEvent.FLAG_FALLBACK) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -180,14 +180,7 @@ public class PojavLoginActivity extends BaseActivity {
|
||||
setContentView(R.layout.activity_pojav_login);
|
||||
|
||||
Spinner spinnerChgLang = findViewById(R.id.login_spinner_language);
|
||||
|
||||
String defaultLang = LocaleUtils.DEFAULT_LOCALE.getDisplayName();
|
||||
SpannableString defaultLangChar = new SpannableString(defaultLang);
|
||||
defaultLangChar.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, defaultLang.length(), 0);
|
||||
|
||||
final ArrayAdapter<DisplayableLocale> langAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item);
|
||||
langAdapter.add(new DisplayableLocale(LocaleUtils.DEFAULT_LOCALE, defaultLangChar));
|
||||
langAdapter.add(new DisplayableLocale(Locale.ENGLISH));
|
||||
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(getAssets().open("language_list.txt")));
|
||||
@@ -205,17 +198,15 @@ public class PojavLoginActivity extends BaseActivity {
|
||||
}
|
||||
|
||||
langAdapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
|
||||
|
||||
int selectedLang = 0;
|
||||
for (int i = 0; i < langAdapter.getCount(); i++) {
|
||||
if (Locale.getDefault().toString().equalsIgnoreCase(langAdapter.getItem(i).mLocale.toString())) {
|
||||
selectedLang = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int selectedLang = getSelectorPosition(langAdapter, LocaleUtils.getLocale());
|
||||
if (selectedLang == -1) selectedLang = getSelectorPosition(langAdapter, null);
|
||||
|
||||
spinnerChgLang.setAdapter(langAdapter);
|
||||
spinnerChgLang.setSelection(selectedLang);
|
||||
if (selectedLang != -1){
|
||||
spinnerChgLang.setSelection(selectedLang);
|
||||
}
|
||||
|
||||
spinnerChgLang.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
|
||||
private boolean isInitCalled;
|
||||
@Override
|
||||
@@ -225,15 +216,7 @@ public class PojavLoginActivity extends BaseActivity {
|
||||
return;
|
||||
}
|
||||
|
||||
Locale locale;
|
||||
if (position == 0) {
|
||||
locale = LocaleUtils.DEFAULT_LOCALE;
|
||||
} else if (position == 1) {
|
||||
locale = Locale.ENGLISH;
|
||||
} else {
|
||||
locale = langAdapter.getItem(position).mLocale;
|
||||
}
|
||||
|
||||
Locale locale = langAdapter.getItem(position).mLocale;
|
||||
LauncherPreferences.PREF_LANGUAGE = locale.toString();
|
||||
LauncherPreferences.DEFAULT_PREF.edit().putString("language", LauncherPreferences.PREF_LANGUAGE).apply();
|
||||
|
||||
@@ -256,6 +239,18 @@ public class PojavLoginActivity extends BaseActivity {
|
||||
});
|
||||
isSkipInit = true;
|
||||
}
|
||||
|
||||
/** @return The index in the array adapter for a given language, or english. -1 if not found */
|
||||
public int getSelectorPosition(@NonNull ArrayAdapter<DisplayableLocale> langAdapter, @Nullable Locale locale){
|
||||
String localeString = locale == null ? Locale.ENGLISH.toString() : locale.toString();
|
||||
for (int i = 0; i < langAdapter.getCount(); i++) {
|
||||
if (localeString.equalsIgnoreCase(langAdapter.getItem(i).mLocale.toString())) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
@@ -349,6 +344,7 @@ public class PojavLoginActivity extends BaseActivity {
|
||||
AssetManager am = this.getAssets();
|
||||
|
||||
unpackComponent(am, "caciocavallo");
|
||||
unpackComponent(am, "caciocavallo17");
|
||||
|
||||
// Since the Java module system doesn't allow multiple JARs to declare the same module,
|
||||
// we repack them to a single file here
|
||||
|
||||
@@ -141,13 +141,7 @@ public final class Tools {
|
||||
|
||||
List<String> javaArgList = new ArrayList<String>();
|
||||
|
||||
// Only Java 8 supports headful AWT for now
|
||||
if (JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0")) {
|
||||
getCacioJavaArgs(javaArgList, false);
|
||||
} else if (LauncherPreferences.PREF_ARC_CAPES) {
|
||||
// Opens the java.net package to Arc DNS injector on Java 9+
|
||||
javaArgList.add("--add-opens=java.base/java.net=ALL-UNNAMED");
|
||||
}
|
||||
getCacioJavaArgs(javaArgList, JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0"));
|
||||
|
||||
/*
|
||||
int mcReleaseDate = Integer.parseInt(versionInfo.releaseTime.substring(0, 10).replace("-", ""));
|
||||
@@ -179,20 +173,46 @@ public final class Tools {
|
||||
JREUtils.launchJavaVM(activity, javaArgList);
|
||||
}
|
||||
|
||||
public static void getCacioJavaArgs(List<String> javaArgList, boolean isHeadless) {
|
||||
javaArgList.add("-Djava.awt.headless="+isHeadless);
|
||||
public static void getCacioJavaArgs(List<String> javaArgList, boolean isJava8) {
|
||||
// Caciocavallo config AWT-enabled version
|
||||
javaArgList.add("-Djava.awt.headless=false");
|
||||
javaArgList.add("-Dcacio.managed.screensize=" + AWTCanvasView.AWT_CANVAS_WIDTH + "x" + AWTCanvasView.AWT_CANVAS_HEIGHT);
|
||||
// javaArgList.add("-Dcacio.font.fontmanager=net.java.openjdk.cacio.ctc.CTCFontManager");
|
||||
javaArgList.add("-Dcacio.font.fontmanager=sun.awt.X11FontManager");
|
||||
javaArgList.add("-Dcacio.font.fontscaler=sun.font.FreetypeFontScaler");
|
||||
javaArgList.add("-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel");
|
||||
javaArgList.add("-Dawt.toolkit=net.java.openjdk.cacio.ctc.CTCToolkit");
|
||||
javaArgList.add("-Djava.awt.graphicsenv=net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
|
||||
if (isJava8) {
|
||||
javaArgList.add("-Dcacio.font.fontmanager=sun.awt.X11FontManager");
|
||||
javaArgList.add("-Dawt.toolkit=net.java.openjdk.cacio.ctc.CTCToolkit");
|
||||
javaArgList.add("-Djava.awt.graphicsenv=net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
|
||||
} else {
|
||||
javaArgList.add("-Dcacio.font.fontmanager=com.github.caciocavallosilano.cacio.ctc.CTCFontManager");
|
||||
javaArgList.add("-Dawt.toolkit=com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
|
||||
javaArgList.add("-Djava.awt.graphicsenv=com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
|
||||
javaArgList.add("-Djava.system.class.loader=com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
|
||||
|
||||
javaArgList.add("--add-exports=java.desktop/java.awt=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/sun.awt.image=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/sun.java2d=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/java.awt.dnd.peer=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/sun.awt=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/sun.awt.event=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/sun.awt.datatransfer=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.desktop/sun.font=ALL-UNNAMED");
|
||||
javaArgList.add("--add-exports=java.base/sun.security.action=ALL-UNNAMED");
|
||||
javaArgList.add("--add-opens=java.base/java.util=ALL-UNNAMED");
|
||||
javaArgList.add("--add-opens=java.desktop/java.awt=ALL-UNNAMED");
|
||||
javaArgList.add("--add-opens=java.desktop/sun.font=ALL-UNNAMED");
|
||||
javaArgList.add("--add-opens=java.desktop/sun.java2d=ALL-UNNAMED");
|
||||
javaArgList.add("--add-opens=java.base/java.lang.reflect=ALL-UNNAMED");
|
||||
|
||||
// Opens the java.net package to Arc DNS injector on Java 9+
|
||||
javaArgList.add("--add-opens=java.base/java.net=ALL-UNNAMED");
|
||||
}
|
||||
|
||||
StringBuilder cacioClasspath = new StringBuilder();
|
||||
cacioClasspath.append("-Xbootclasspath/p");
|
||||
File cacioDir = new File(DIR_GAME_HOME + "/caciocavallo");
|
||||
cacioClasspath.append("-Xbootclasspath/" + (isJava8 ? "p" : "a"));
|
||||
File cacioDir = new File(DIR_GAME_HOME + "/caciocavallo" + (isJava8 ? "" : "17"));
|
||||
if (cacioDir.exists() && cacioDir.isDirectory()) {
|
||||
for (File file : cacioDir.listFiles()) {
|
||||
if (file.getName().endsWith(".jar")) {
|
||||
@@ -256,6 +276,7 @@ public final class Tools {
|
||||
gameDir.mkdirs();
|
||||
|
||||
Map<String, String> varArgMap = new ArrayMap<>();
|
||||
varArgMap.put("auth_session", profile.accessToken); // For legacy versions of MC
|
||||
varArgMap.put("auth_access_token", profile.accessToken);
|
||||
varArgMap.put("auth_player_name", username);
|
||||
varArgMap.put("auth_uuid", profile.profileId);
|
||||
|
||||
@@ -40,6 +40,20 @@ public class Touchpad extends FrameLayout {
|
||||
private float mPrevX, mPrevY;
|
||||
/* Last first pointer positions non-scaled, used to scroll distance */
|
||||
private float mScrollLastInitialX, mScrollLastInitialY;
|
||||
/* Handler and message to check if we are grabbing */
|
||||
private final Runnable mGrabRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!CallbackBridge.isGrabbing() && mDisplayState && getVisibility() != VISIBLE) {
|
||||
enable();
|
||||
}else{
|
||||
if ((CallbackBridge.isGrabbing() && getVisibility() != View.GONE) || !mDisplayState && getVisibility() == VISIBLE) {
|
||||
disable();
|
||||
}
|
||||
}
|
||||
postDelayed(this, 250);
|
||||
}
|
||||
};
|
||||
|
||||
public Touchpad(@NonNull Context context) {
|
||||
this(context, null);
|
||||
@@ -170,20 +184,7 @@ public class Touchpad extends FrameLayout {
|
||||
// When the game is grabbing, we should not display the mouse
|
||||
disable();
|
||||
mDisplayState = false;
|
||||
Thread virtualMouseGrabThread = new Thread(() -> {
|
||||
while (true) {
|
||||
if (!CallbackBridge.isGrabbing() && mDisplayState && getVisibility() != VISIBLE) {
|
||||
post(this::enable);
|
||||
}else{
|
||||
if ((CallbackBridge.isGrabbing() && getVisibility() != View.GONE) || !mDisplayState && getVisibility() == VISIBLE) {
|
||||
post(this::disable);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}, "VirtualMouseGrabThread");
|
||||
virtualMouseGrabThread.setPriority(Thread.MIN_PRIORITY);
|
||||
virtualMouseGrabThread.start();
|
||||
postDelayed(mGrabRunnable, 250);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -77,16 +77,11 @@ public class MultiRTUtils {
|
||||
|
||||
public static void installRuntimeNamed(String nativeLibDir, InputStream runtimeInputStream, String name, RuntimeProgressReporter progressReporter) throws IOException {
|
||||
File dest = new File(RUNTIME_FOLDER,"/"+name);
|
||||
File tmp = new File(dest,"temporary");
|
||||
if(dest.exists()) FileUtils.deleteDirectory(dest);
|
||||
dest.mkdirs();
|
||||
FileOutputStream fos = new FileOutputStream(tmp);
|
||||
progressReporter.reportStringProgress(R.string.multirt_progress_caching);
|
||||
IOUtils.copy(runtimeInputStream,fos);
|
||||
fos.close();
|
||||
|
||||
uncompressTarXZ(runtimeInputStream,dest,progressReporter);
|
||||
runtimeInputStream.close();
|
||||
uncompressTarXZ(tmp,dest,progressReporter);
|
||||
tmp.delete();
|
||||
unpack200(nativeLibDir,RUNTIME_FOLDER + "/" + name);
|
||||
read(name);
|
||||
}
|
||||
@@ -230,25 +225,16 @@ public class MultiRTUtils {
|
||||
}
|
||||
|
||||
private static void installRuntimeNamedNoRemove(InputStream runtimeInputStream, File dest, RuntimeProgressReporter progressReporter) throws IOException {
|
||||
File tmp = new File(dest,"temporary");
|
||||
FileOutputStream fos = new FileOutputStream(tmp);
|
||||
progressReporter.reportStringProgress(R.string.multirt_progress_caching);
|
||||
IOUtils.copy(runtimeInputStream,fos);
|
||||
fos.close();
|
||||
|
||||
uncompressTarXZ(runtimeInputStream,dest,progressReporter);
|
||||
runtimeInputStream.close();
|
||||
uncompressTarXZ(tmp,dest,progressReporter);
|
||||
tmp.delete();
|
||||
}
|
||||
|
||||
private static void uncompressTarXZ(final File tarFile, final File dest, final RuntimeProgressReporter thingy) throws IOException {
|
||||
private static void uncompressTarXZ(final InputStream tarFileInputStream, final File dest, final RuntimeProgressReporter thingy) throws IOException {
|
||||
dest.mkdirs();
|
||||
|
||||
TarArchiveInputStream tarIn = new TarArchiveInputStream(
|
||||
new XZCompressorInputStream(
|
||||
new BufferedInputStream(
|
||||
new FileInputStream(tarFile)
|
||||
)
|
||||
)
|
||||
new XZCompressorInputStream(tarFileInputStream)
|
||||
);
|
||||
TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
|
||||
// tarIn is a TarArchiveInputStream
|
||||
|
||||
@@ -23,7 +23,7 @@ public class LauncherPreferences {
|
||||
public static String PREF_DEFAULTCTRL_PATH = Tools.CTRLDEF_FILE;
|
||||
public static String PREF_CUSTOM_JAVA_ARGS;
|
||||
public static String PREF_LANGUAGE = "default";
|
||||
public static String PREF_VERSION_REPOS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json";
|
||||
public static String PREF_VERSION_REPOS = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
|
||||
public static boolean PREF_CHECK_LIBRARY_SHA = true;
|
||||
public static boolean PREF_DISABLE_GESTURES = false;
|
||||
public static float PREF_MOUSESPEED = 1f;
|
||||
|
||||
@@ -92,7 +92,7 @@ public class MinecraftDownloaderTask extends AsyncTask<String, String, Throwable
|
||||
verInfo = Tools.getVersionInfo(mActivity,p1[0]);
|
||||
|
||||
//Now we have the reliable information to check if our runtime settings are good enough
|
||||
if(verInfo.javaVersion != null) { //1.17+
|
||||
if(verInfo.javaVersion != null && !verInfo.javaVersion.component.equalsIgnoreCase("jre-legacy")) { //1.17+
|
||||
LauncherProfiles.update();
|
||||
MinecraftProfile minecraftProfile = LauncherProfiles.mainProfileJson.profiles.get(LauncherPreferences.DEFAULT_PREF.getString(LauncherPreferences.PREF_KEY_CURRENT_PROFILE,""));
|
||||
if(minecraftProfile == null) throw new SilentException();
|
||||
@@ -121,11 +121,7 @@ public class MinecraftDownloaderTask extends AsyncTask<String, String, Throwable
|
||||
}
|
||||
} //if else, we are satisfied
|
||||
}
|
||||
{ //run the checks to detect if we have a *brand new* engine
|
||||
int mcReleaseDate = Integer.parseInt(verInfo.releaseTime.substring(0, 10).replace("-", ""));
|
||||
if(mcReleaseDate > 20210225 && verInfo.javaVersion != null && verInfo.javaVersion.majorVersion > 15)
|
||||
V117CompatUtil.runCheck(mActivity);
|
||||
}
|
||||
|
||||
try {
|
||||
assets = downloadIndex(verInfo.assets, new File(Tools.ASSETS_PATH, "indexes/" + verInfo.assets + ".json"));
|
||||
} catch (IOException e) {
|
||||
@@ -465,10 +461,13 @@ public class MinecraftDownloaderTask extends AsyncTask<String, String, Throwable
|
||||
JAssetInfo asset = assetsObjects.get(assetKey);
|
||||
assetsSizeBytes+=asset.size;
|
||||
String assetPath = asset.hash.substring(0, 2) + "/" + asset.hash;
|
||||
File outFile = assets.mapToResources ?new File(objectsDir,"/"+assetKey):new File(objectsDir, assetPath);
|
||||
File outFile = assets.mapToResources ?new File(outputDir,"/"+assetKey):new File(objectsDir, assetPath);
|
||||
boolean skip = outFile.exists();// skip if the file exists
|
||||
if(LauncherPreferences.PREF_CHECK_LIBRARY_SHA) //if sha checking is enabled
|
||||
if(skip) skip = Tools.compareSHA1(outFile, asset.hash); //check hash
|
||||
if(LauncherPreferences.PREF_CHECK_LIBRARY_SHA && skip){
|
||||
//if sha checking is enabled
|
||||
skip = Tools.compareSHA1(outFile, asset.hash); //check hash
|
||||
}
|
||||
|
||||
if(skip) {
|
||||
downloadedSize.addAndGet(asset.size);
|
||||
}else{
|
||||
|
||||
@@ -1,37 +1,60 @@
|
||||
package net.kdt.pojavlaunch.utils;
|
||||
|
||||
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_LANGUAGE;
|
||||
|
||||
import android.content.*;
|
||||
import android.content.res.*;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.preference.*;
|
||||
import java.util.*;
|
||||
import net.kdt.pojavlaunch.prefs.*;
|
||||
|
||||
public class LocaleUtils {
|
||||
public static final Locale DEFAULT_LOCALE;
|
||||
|
||||
static {
|
||||
DEFAULT_LOCALE = Locale.getDefault();
|
||||
|
||||
private static Locale CURRENT_LOCALE;
|
||||
|
||||
public static Locale getLocale(){
|
||||
return Locale.getDefault();
|
||||
}
|
||||
|
||||
public static Context setLocale(Context context) {
|
||||
if (LauncherPreferences.DEFAULT_PREF == null) {
|
||||
LauncherPreferences.DEFAULT_PREF = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
LauncherPreferences.loadPreferences(context);
|
||||
LauncherPreferences.loadPreferences(context);
|
||||
}
|
||||
|
||||
Locale locale;
|
||||
|
||||
|
||||
if (LauncherPreferences.PREF_LANGUAGE.equals("default")) {
|
||||
locale = DEFAULT_LOCALE;
|
||||
CURRENT_LOCALE = getLocale();
|
||||
} else {
|
||||
locale = new Locale(LauncherPreferences.PREF_LANGUAGE);
|
||||
if(CURRENT_LOCALE == null || !PREF_LANGUAGE.equalsIgnoreCase(CURRENT_LOCALE.toString())){
|
||||
String[] localeString;
|
||||
if(PREF_LANGUAGE.contains("_")){
|
||||
localeString = PREF_LANGUAGE.split("_");
|
||||
}else{
|
||||
localeString = new String[]{PREF_LANGUAGE, ""};
|
||||
}
|
||||
CURRENT_LOCALE = new Locale(localeString[0], localeString[1]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Locale.setDefault(locale);
|
||||
Locale.setDefault(CURRENT_LOCALE);
|
||||
|
||||
Resources res = context.getResources();
|
||||
Configuration config = new Configuration(res.getConfiguration());
|
||||
config.setLocale(locale);
|
||||
context = context.createConfigurationContext(config);
|
||||
Configuration config = res.getConfiguration();
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 24) {
|
||||
config.setLocale(CURRENT_LOCALE);
|
||||
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
|
||||
} else {
|
||||
config.locale = CURRENT_LOCALE;
|
||||
context.getApplicationContext().createConfigurationContext(config);
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,176 +0,0 @@
|
||||
package net.kdt.pojavlaunch.utils;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.res.AssetManager;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import net.kdt.pojavlaunch.BaseLauncherActivity;
|
||||
import net.kdt.pojavlaunch.R;
|
||||
import net.kdt.pojavlaunch.Tools;
|
||||
import net.kdt.pojavlaunch.prefs.LauncherPreferences;
|
||||
import net.kdt.pojavlaunch.tasks.MinecraftDownloaderTask;
|
||||
import net.kdt.pojavlaunch.value.PerVersionConfig;
|
||||
import net.kdt.pojavlaunch.value.launcherprofiles.LauncherProfiles;
|
||||
import net.kdt.pojavlaunch.value.launcherprofiles.MinecraftProfile;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class V117CompatUtil {
|
||||
/*
|
||||
/*
|
||||
New rendering engine was added in snapshot 21w10a
|
||||
21a08b (FP (GL2) engine): 20210225
|
||||
21w10a (non-FP engine): 20210310
|
||||
|
||||
boolean skipResDialog = false;
|
||||
if(mcReleaseDate > 20210225) skipResDialog = true;
|
||||
PerVersionConfig.update(); //Prepare the PVC
|
||||
PerVersionConfig.VersionConfig cfg = PerVersionConfig.configMap.get(p1[0]); //Get the version config...
|
||||
if (cfg == null) {
|
||||
cfg = new PerVersionConfig.VersionConfig();//or create a new one!
|
||||
PerVersionConfig.configMap.put(p1[0], cfg);//and put it into the base
|
||||
}
|
||||
MCOptionUtils.load();
|
||||
|
||||
if(!skipResDialog) {
|
||||
AtomicBoolean proceed = new AtomicBoolean(false);
|
||||
Object lock = new Object();
|
||||
mActivity.runOnUiThread(() -> {
|
||||
AlertDialog.Builder bldr = new AlertDialog.Builder(mActivity);
|
||||
bldr.setTitle(R.string.global_warinng);
|
||||
bldr.setMessage(R.string.compat_117_message);
|
||||
bldr.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
proceed.set(true);
|
||||
synchronized (lock) { lock.notifyAll(); }
|
||||
dialog.dismiss();
|
||||
});
|
||||
bldr.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
|
||||
synchronized (lock) { lock.notifyAll(); }
|
||||
dialog.dismiss();
|
||||
});
|
||||
bldr.setCancelable(false);
|
||||
bldr.show();
|
||||
});
|
||||
synchronized (lock) {
|
||||
lock.wait();
|
||||
}
|
||||
if(proceed.get()) {
|
||||
File resourcepacksDir = new File(cfg.gamePath==null? Tools.DIR_GAME_NEW:cfg.gamePath,"resourcepacks");
|
||||
if(!resourcepacksDir.exists()) resourcepacksDir.mkdirs();
|
||||
FileOutputStream fos = new FileOutputStream(new File(resourcepacksDir,"assets-v0.zip"));
|
||||
InputStream is = this.mActivity.getAssets().open("assets-v0.zip");
|
||||
IOUtils.copy(is,fos);
|
||||
is.close();fos.close();
|
||||
String resourcepacks = MCOptionUtils.get("resourcePacks");
|
||||
if(resourcepacks == null || !resourcepacks.contains("assets-v0.zip")) {
|
||||
List<String> resPacksArray = resourcepacks == null ? new ArrayList(): Arrays.asList()
|
||||
}
|
||||
}else throw new MinecraftDownloaderTask.SilentException();
|
||||
}
|
||||
*/
|
||||
private static List<String> getTexturePackList(String param) {
|
||||
if (param == null) {
|
||||
Log.i("V117CompatDebug","null, defaulting to empty");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
Log.i("V117CompatDebug",param);
|
||||
if("[]".equals(param)) return new ArrayList<>();
|
||||
Log.i("V117CompatDebug","ph2");
|
||||
if(param == null) return new ArrayList<>();
|
||||
Log.i("V117CompatDebug","ph3");
|
||||
String rawList = param.substring(1,param.length()-1);
|
||||
Log.i("V117CompatDebug",rawList);
|
||||
return new ArrayList<>(Arrays.asList(rawList.split(",")));
|
||||
}
|
||||
|
||||
private static String regenPackList(List<String> packs) {
|
||||
if(packs.size()==0) return "[]";
|
||||
StringBuilder ret = new StringBuilder("[" + packs.get(0));
|
||||
for(int i = 1; i < packs.size(); i++) {
|
||||
ret.append(",").append(packs.get(i));
|
||||
}
|
||||
ret.append("]");
|
||||
return ret.toString();
|
||||
}
|
||||
|
||||
public static void runCheck(Activity activity) throws Exception{
|
||||
|
||||
|
||||
MCOptionUtils.load();
|
||||
|
||||
List<String> packList =getTexturePackList(MCOptionUtils.get("resourcePacks"));
|
||||
String renderer;
|
||||
String gamePath;
|
||||
LauncherProfiles.update();
|
||||
String selectedProfile = LauncherPreferences.DEFAULT_PREF.getString(LauncherPreferences.PREF_KEY_CURRENT_PROFILE,"");
|
||||
MinecraftProfile prof = LauncherProfiles.mainProfileJson.profiles.get(selectedProfile);
|
||||
if(prof == null) throw new MinecraftDownloaderTask.SilentException();
|
||||
renderer = prof.pojavRendererName != null ? prof.pojavRendererName : LauncherPreferences.PREF_RENDERER;
|
||||
gamePath = prof.gameDir != null && prof.gameDir.startsWith(Tools.LAUNCHERPROFILES_RTPREFIX) ? prof.gameDir.replace(Tools.LAUNCHERPROFILES_RTPREFIX,Tools.DIR_GAME_HOME + "/") : Tools.DIR_GAME_NEW;
|
||||
|
||||
//String
|
||||
|
||||
if(renderer.equals("vulkan_zink") || renderer.equals("opengles3_virgl")) return; //don't install for zink/virgl users;
|
||||
if(packList.contains("\"assets-v0.zip\"")) return;
|
||||
if(JREUtils.getDetectedVersion() >= 3) return; // GL4ES_extra supports 1.17+
|
||||
|
||||
Object lock = new Object();
|
||||
AtomicInteger proceed = new AtomicInteger(0);
|
||||
activity.runOnUiThread(() -> {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
builder.setTitle(R.string.global_warinng);
|
||||
builder.setMessage(R.string.compat_117_message);
|
||||
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
proceed.set(1);
|
||||
synchronized (lock) { lock.notifyAll(); }
|
||||
});
|
||||
builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
|
||||
synchronized (lock) { lock.notifyAll(); }
|
||||
});
|
||||
builder.setNeutralButton(R.string.compat_11x_playanyway, (dialog, which) -> {
|
||||
proceed.set(2);
|
||||
synchronized (lock) { lock.notifyAll(); }
|
||||
});
|
||||
builder.setCancelable(false);
|
||||
builder.show();
|
||||
});
|
||||
|
||||
synchronized (lock) {
|
||||
lock.wait();
|
||||
}
|
||||
switch(proceed.get()) {
|
||||
case 1:
|
||||
MinecraftProfile minecraftProfile = LauncherProfiles.mainProfileJson.profiles.get(selectedProfile);
|
||||
if(minecraftProfile == null) throw new MinecraftDownloaderTask.SilentException();
|
||||
minecraftProfile.pojavRendererName = "opengles2";
|
||||
LauncherProfiles.update();
|
||||
copyResourcePack(gamePath,activity.getAssets());
|
||||
if(!packList.contains("\"assets-v0.zip\"")) packList.add(0,"\"assets-v0.zip\"");
|
||||
MCOptionUtils.set("resourcePacks",regenPackList(packList));
|
||||
MCOptionUtils.save();
|
||||
break;
|
||||
case 0:
|
||||
throw new MinecraftDownloaderTask.SilentException();
|
||||
}
|
||||
}
|
||||
|
||||
public static void copyResourcePack(String gameDir, AssetManager am) throws IOException {
|
||||
File resourcepacksDir = new File(gameDir,"resourcepacks");
|
||||
if(!resourcepacksDir.exists()) resourcepacksDir.mkdirs();
|
||||
FileOutputStream fos = new FileOutputStream(new File(resourcepacksDir,"assets-v0.zip"));
|
||||
InputStream is = am.open("assets-v0.zip");
|
||||
IOUtils.copy(is,fos);
|
||||
is.close();fos.close();
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,12 @@ import android.os.Looper;
|
||||
|
||||
import net.kdt.pojavlaunch.*;
|
||||
import android.content.*;
|
||||
import android.view.Choreographer;
|
||||
|
||||
public class CallbackBridge {
|
||||
public static Choreographer sChoreographer = Choreographer.getInstance();
|
||||
private static boolean isGrabbing = false;
|
||||
private static long lastGrabTime = System.currentTimeMillis();
|
||||
public static final int ANDROID_TYPE_GRAB_STATE = 0;
|
||||
|
||||
public static final int CLIPBOARD_COPY = 2000;
|
||||
@@ -21,12 +25,9 @@ public class CallbackBridge {
|
||||
public volatile static boolean holdingAlt, holdingCapslock, holdingCtrl,
|
||||
holdingNumlock, holdingShift;
|
||||
|
||||
|
||||
public static void putMouseEventWithCoords(int button, float x, float y) {
|
||||
putMouseEventWithCoords(button, true, x, y);
|
||||
Handler handler = new Handler(Looper.getMainLooper());
|
||||
handler.postDelayed(() -> putMouseEventWithCoords(button, false, x, y), 22);
|
||||
|
||||
sChoreographer.postFrameCallbackDelayed(l -> putMouseEventWithCoords(button, false, x, y), 33);
|
||||
}
|
||||
|
||||
public static void putMouseEventWithCoords(int button, boolean isDown, float x, float y /* , int dz, long nanos */) {
|
||||
@@ -119,8 +120,13 @@ public class CallbackBridge {
|
||||
}
|
||||
|
||||
public static boolean isGrabbing() {
|
||||
// return isGrabbing;
|
||||
return nativeIsGrabbing();
|
||||
// Avoid going through the JNI each time.
|
||||
long currentTime = System.currentTimeMillis();
|
||||
if (currentTime - lastGrabTime > 250){
|
||||
isGrabbing = nativeIsGrabbing();
|
||||
lastGrabTime = currentTime;
|
||||
}
|
||||
return isGrabbing;
|
||||
}
|
||||
|
||||
// Called from JRE side
|
||||
|
||||
@@ -35,6 +35,10 @@ JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_AWTInputBridge_nativeSendData(JN
|
||||
|
||||
if (method_ReceiveInput == NULL) {
|
||||
class_CTCAndroidInput = (*runtimeJNIEnvPtr_INPUT)->FindClass(runtimeJNIEnvPtr_INPUT, "net/java/openjdk/cacio/ctc/CTCAndroidInput");
|
||||
if ((*runtimeJNIEnvPtr_INPUT)->ExceptionCheck(runtimeJNIEnvPtr_INPUT) == JNI_TRUE) {
|
||||
(*runtimeJNIEnvPtr_INPUT)->ExceptionClear(runtimeJNIEnvPtr_INPUT);
|
||||
class_CTCAndroidInput = (*runtimeJNIEnvPtr_INPUT)->FindClass(runtimeJNIEnvPtr_INPUT, "com/github/caciocavallosilano/cacio/ctc/CTCAndroidInput");
|
||||
}
|
||||
assert(class_CTCAndroidInput != NULL);
|
||||
method_ReceiveInput = (*runtimeJNIEnvPtr_INPUT)->GetStaticMethodID(runtimeJNIEnvPtr_INPUT, class_CTCAndroidInput, "receiveData", "(IIIII)V");
|
||||
assert(method_ReceiveInput != NULL);
|
||||
@@ -64,6 +68,10 @@ JNIEXPORT jintArray JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_renderAWTScr
|
||||
|
||||
if (method_GetRGB == NULL) {
|
||||
class_CTCScreen = (*runtimeJNIEnvPtr_GRAPHICS)->FindClass(runtimeJNIEnvPtr_GRAPHICS, "net/java/openjdk/cacio/ctc/CTCScreen");
|
||||
if ((*runtimeJNIEnvPtr_GRAPHICS)->ExceptionCheck(runtimeJNIEnvPtr_GRAPHICS) == JNI_TRUE) {
|
||||
(*runtimeJNIEnvPtr_GRAPHICS)->ExceptionClear(runtimeJNIEnvPtr_GRAPHICS);
|
||||
class_CTCScreen = (*runtimeJNIEnvPtr_GRAPHICS)->FindClass(runtimeJNIEnvPtr_GRAPHICS, "com/github/caciocavallosilano/cacio/ctc/CTCScreen");
|
||||
}
|
||||
assert(class_CTCScreen != NULL);
|
||||
method_GetRGB = (*runtimeJNIEnvPtr_GRAPHICS)->GetStaticMethodID(runtimeJNIEnvPtr_GRAPHICS, class_CTCScreen, "getCurrentScreenRGB", "()[I");
|
||||
assert(method_GetRGB != NULL);
|
||||
|
||||
@@ -416,8 +416,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_glfw_GLFW_nglfwSetShowingWindow(JNIEnv* en
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSetWindowAttrib(JNIEnv* env, jclass clazz, jint attrib, jint value) {
|
||||
if (!showingWindow) {
|
||||
return; // nothing to do yet
|
||||
if (!showingWindow || !isUseStackQueueCall) {
|
||||
// If the window is not shown, there is nothing to do yet.
|
||||
// For Minecraft < 1.13, calling to JNI functions here crashes the JVM for some reason, therefore it is skipped for now.
|
||||
return;
|
||||
}
|
||||
|
||||
jclass glfwClazz = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "org/lwjgl/glfw/GLFW");
|
||||
|
||||
@@ -1,254 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App name part -->
|
||||
<string name="app_name">(pᴉoɹpuⱯ ɹoɟ uoᴉʇᴉpƎ ɐʌɐՐ :ʇɟɐɹɔǝuᴉW) ɹǝɥɔunɐꞀʌɐɾoԀ</string>
|
||||
<string name="app_short_name">ɹǝɥɔunɐꞀʌɐɾoԀ</string>
|
||||
<string name="app_motd">¡ǝɔᴉʌǝp ɹnoʎ uᴉ uoᴉʇᴉpƎ ɐʌɐՐ :ʇɟɐɹɔǝuᴉW ɥɔunɐꞀ</string>
|
||||
<!-- Action bar part -->
|
||||
<!-- Languages list part -->
|
||||
<!-- Login strings -->
|
||||
<string name="login_online_username_hint">ǝɯɐuɹǝsn ɹo ꞁᴉɐɯƎ</string>
|
||||
<string name="login_online_password_hint">pɹoʍssɐԀ</string>
|
||||
<string name="login_online_check_keeplogin">uᴉ pǝᵷᵷoꞁ ǝɯ dǝǝꞰ</string>
|
||||
<string name="login_online_login_label">uᴉᵷoꞀ</string>
|
||||
<string name="login_error_invalid_username">˙ǝɹoɔsɹǝpun puɐ 6-0 \'z-ɐ \'Z-Ɐ suᴉɐʇuoɔ ʎꞁuo pꞁnoɥs \'sɹǝʇɔɐɹɐɥɔ 9⥝-Ɛ ɟo ǝᵷuɐɹ uᴉ ǝq ʇsnɯ ǝɯɐuɹǝs∩ ˙ǝɯɐuɹǝsn pᴉꞁɐʌuI</string>
|
||||
<string name="login_error_exist_username">ʇsᴉxǝ ʎpɐǝɹꞁɐ ǝɯɐuɹǝsn sᴉɥ⟘</string>
|
||||
<string name="login_microsoft">uᴉᵷoꞁ ʇɟosoɹɔᴉW</string>
|
||||
<string name="login_select_account">ʇunoɔɔɐ ʇɔǝꞁǝS</string>
|
||||
<string name="login_title_no_saved_account">¡ punoɟ ʇunoɔɔɐ oN</string>
|
||||
<string name="login_dialog_no_saved_account">˙uᴉᵷoꞁ ʇsɹᴉɟ uodn ʇunoɔɔɐ uɐ ǝʌɐs oʇ </b>,, uᴉ pǝᵷᵷoꞁ ǝɯ dǝǝꞰ,,<b> uoᴉʇdo ǝɥʇ ǝs∩\n˙ʇunoɔɔɐ pǝʌɐs ʎuɐ ǝʌɐɥ ʇ, uop no⅄.</string>
|
||||
<!-- Hint -->
|
||||
<string name="hint_control_mapping">"˙ǝʇǝꞁǝp ɹo ǝzᴉsǝɹ 'ʇᴉpǝ :ǝzᴉɯoʇsnɔ oʇ uoʇʇnq ɐ pꞁoH\n◀ nuǝɯ uǝdo oʇ ʇɟǝꞁ oʇ ʇɥᵷᴉɹ ɯoɹɟ ǝdᴉʍS"</string>
|
||||
<!-- Warnings -->
|
||||
<string name="warning_remove_account">¡pǝʌoɯǝɹ ǝq ꞁꞁᴉʍ ʇunoɔɔɐ sᴉɥ⟘</string>
|
||||
<!-- AlertDialog title -->
|
||||
<string name="alerttitle_install_jre">(zx˙ɹɐʇ˙) %s ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuI</string>
|
||||
<string name="alerttitle_installmod">ɹǝꞁꞁɐʇsuᴉ poɯ ɐ ʇɔǝꞁǝS</string>
|
||||
<!-- Error messages -->
|
||||
<string name="error_fatal">pǝɥsɐɹɔ ʎꞁpǝʇɔǝdxǝun sɐɥ ɹǝɥɔunɐꞀʌɐɾoԀ</string>
|
||||
<string name="error_no_version">¡uoᴉsɹǝʌ oN</string>
|
||||
<string name="error_show_more">ǝɹoɯ ʍoɥS</string>
|
||||
<string name="error_show_less">ssǝꞁ ʍoɥS</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_permission_denied">¡pǝɹᴉnbǝɹ sᴉ uoᴉssᴉɯɹǝd ǝᵷɐɹoʇs oʇ ǝʇᴉɹʍ/pɐǝɹ ǝɥ⟘</string>
|
||||
<string name="toast_optifine_success">ꞁnɟssǝɔɔns ꞁꞁɐʇsuI</string>
|
||||
<string name="toast_uninstalljre_done">ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuᴉun ǝuoᗡ</string>
|
||||
<!--
|
||||
<string name="toast_3">Exit</string>
|
||||
-->
|
||||
<!-- MCLauncherActivity: Tabs -->
|
||||
<string name="mcl_tab_news">sʍǝN</string>
|
||||
<string name="mcl_tab_console">ǝꞁosuoɔ ʇuǝɯdoꞁǝʌǝᗡ</string>
|
||||
<string name="mcl_tab_crash">ᵷoꞁ ɥsɐɹƆ</string>
|
||||
<!-- MCLauncherActivity: Account status -->
|
||||
<string name="mcl_account_connected">pǝʇɔǝuuoƆ</string>
|
||||
<string name="mcl_account_local">lɐɔo˥</string>
|
||||
<!-- MCLauncherActivity: Strings -->
|
||||
<string name="mcl_version_msg">%s ʇɟɐɹɔǝuᴉW ʎɐꞁd oʇ ʎpɐǝᴚ</string>
|
||||
<string name="mcl_launch_cleancache">sǝꞁᴉɟ ǝɥɔɐɔ ᵷuᴉuɐǝꞁƆ</string>
|
||||
<string name="mcl_launch_downloading">%s ᵷuᴉpɐoꞁuʍoᗡ</string>
|
||||
<string name="mcl_launch_downloading_progress">"(ᗺW %.2f / ᗺW %.2f) %s ᵷuᴉpɐoꞁuʍoᗡ"</string>
|
||||
<string name="mcl_launch_download_assets">sǝɔɹnosǝɹ pɐoꞁuʍop oʇ ᵷuᴉɹɐdǝɹԀ</string>
|
||||
<string name="mcl_launch_error_localmode">˙ǝnuᴉʇuoɔ oʇ ʇunoɔɔɐ ǝuᴉluo uɐ oʇ ɥɔʇᴉʍs ǝsɐǝlԀ ˙ʇunoɔɔɐ lɐɔol ɐ ɥʇᴉʍ uᴉ pǝƃƃol uǝɥʍ pǝllɐʇsuᴉ ʎllɐƃǝl ǝq ʇ,uɐɔ ʇɟɐɹɔǝuᴉW</string>
|
||||
<string name="mcl_options">suoᴉʇdO</string>
|
||||
<string name="mcl_option_modinstall">(˙˙˙ɔʇǝ \'ɔᴉɹqɐℲ \'poWʎqɐꞀ \'ǝᵷɹoℲ) ɹǝꞁꞁɐʇsuᴉ poɯ ɐ ɥɔunɐꞀ</string>
|
||||
<string name="mcl_option_modinstallwitharg">(sʇuǝɯnᵷɹɐ ɯoʇsnɔ ɥʇᴉʍ) ɹǝꞁꞁɐʇsuᴉ poɯ ɐ ɥɔunɐꞀ</string>
|
||||
<string name="mcl_option_customcontrol">sꞁoɹʇuoɔ ɯoʇsnƆ</string>
|
||||
<string name="mcl_option_settings">sᵷuᴉʇʇǝS</string>
|
||||
<string name="mcl_option_about">ʇnoqⱯ</string>
|
||||
<string name="mcl_setting_title_use_surface_view">ƃuᴉɹǝpuǝɹ ǝɔɐɟɹns ǝʇɐuɹǝʇlɐ ǝs∩</string>
|
||||
<string name="mcl_setting_subtitle_use_surface_view">soᴉɹɐuǝɔs punoq ndƃ uᴉ ǝɔuɐɯɹoɟɹǝd dlǝɥ ʎɐW</string>
|
||||
<string name="mcl_setting_title_uninstalljre">ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuᴉu∩</string>
|
||||
<string name="mcl_setting_subtitle_uninstalljre">ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuᴉ-ǝɹ noʎ ʇǝꞁ sᴉɥ⟘ [pǝɹᴉnbǝɹ ʇɹɐʇsǝɹ ɹǝɥɔunɐꞀ]</string>
|
||||
<string name="mcl_setting_title_freeform">ǝpoɯ ɯɹoɟǝǝɹℲ uᴉ ʇɟɐɹɔǝuᴉW ɥɔunɐꞀ</string>
|
||||
<string name="mcl_setting_subtitle_freeform">+0˙ㄥ pᴉoɹpuⱯ sǝɹᴉnbǝᴚ ˙ʍopuᴉʍ ᵷuᴉʇɐoꞁɟ uᴉ ʇɟɐɹɔǝuᴉW ɥɔunɐꞀ</string>
|
||||
<string name="mcl_setting_title_hide_sidebar">ɹɐqǝpᴉS ǝpᴉH</string>
|
||||
<string name="mcl_setting_subtitle_hide_sidebar">˙ǝɔuǝᴉɹǝdxǝ uǝǝɹɔsꞁꞁnɟ ǝɹoɯ ɐ noʎ sǝʌᴉ⅁ ˙sᴉɥʇ ǝʞᴉꞁ ʇɥᵷᴉɯ I∩ ⥝ʌ pꞁo ǝɥʇ ᵷuᴉɹɹǝɟǝɹd sʞꞁoɟ ɔᴉᵷꞁɐʇsoN</string>
|
||||
<string name="mcl_setting_title_ignore_notch">ɥɔʇou ǝɹouᵷI</string>
|
||||
<string name="mcl_setting_subtitle_ignore_notch">˙ǝɔuǝᴉɹǝdxǝ ǝʌᴉsɹǝɯɯᴉ ǝɹoɯ ɐ noʎ sǝʌᴉ⅁\n˙ʇᴉ ɹǝpun uǝǝɹɔs ǝɥʇ spuǝʇxǝ puɐ ɥɔʇou ǝɥʇ ǝɹouᵷI</string>
|
||||
<string name="mcl_setting_title_resolution_scaler">ɹǝꞁɐɔS uoᴉʇnꞁosǝᴚ</string>
|
||||
<string name="mcl_setting_subtitle_resolution_scaler">uoᴉʇnꞁosǝɹ ꞁꞁnɟ sᴉ %00⥝ ˙uoᴉʇnꞁosǝɹ ǝɯɐᵷ ǝɥʇ ǝsɐǝɹɔǝp oʇ noʎ sʍoꞁꞁⱯ</string>
|
||||
<string name="mcl_setting_title_longpresstrigger">ssǝɹd ᵷuoꞁ ɹǝʇɟɐ ɹǝᵷᵷᴉɹʇ ꞁꞁᴉʍ ᵷuoꞁ ʍoH</string>
|
||||
<string name="mcl_setting_subtitle_longpresstrigger">˙ɯǝʇᴉ doɹp puɐ ʞɔoꞁq ʎoɹʇsǝp uᴉ ssǝɹd ᵷuoꞁ ɹoɟ ǝɯᴉʇ ɹǝᵷᵷᴉɹʇ ǝᵷuɐɥƆ</string>
|
||||
<string name="mcl_setting_title_backtorightmouse">ǝsnoɯ ʇɥᵷᴉɹ sɐ uoʇʇnq ʞɔɐq ʇɐǝɹ⟘</string>
|
||||
<string name="mcl_setting_subtitle_backtorightmouse">˙sᴉɥʇ ǝꞁqɐuǝ pꞁnoɥs noʎ \'ǝsnoɯ ꞁɐuɹǝʇxǝ ᵷuᴉsn ǝɹɐ noʎ ɟI ˙uoʇʇnq ʞɔɐq sɐ ǝsnoɯ ʇɥᵷᴉɹ ꞁɐuɹǝʇxǝ sʇɐǝɹʇ sǝɔᴉʌǝp ǝɯoS</string>
|
||||
<string name="mcl_setting_title_flat_button_style">ǝꞁʎʇs uoʇʇnq ʇɐꞁℲ</string>
|
||||
<string name="mcl_setting_subtitle_flat_button_style">˙ʇɐꞁɟ oʇ ǝꞁʎʇs uoʇʇnq ꞁoɹʇuoɔ ǝᵷuɐɥɔ oʇ sᴉɥʇ ǝꞁqɐuƎ</string>
|
||||
<string name="mcl_setting_title_buttonscale">ᵷuᴉꞁɐɔs suoʇʇnq ꞁoɹʇuoƆ</string>
|
||||
<string name="mcl_setting_subtitle_buttonscale">˙ꞁꞁɐɯs ooʇ ǝɹɐ suoʇʇnq ɟᴉ ɯǝɥʇ ǝꞁɐɔsd∩</string>
|
||||
<string name="mcl_setting_title_mousescale">ᵷuᴉꞁɐɔs ǝsnoW</string>
|
||||
<string name="mcl_setting_subtitle_mousescale">˙ǝsnoɯ ꞁɐnʇɹᴉʌ ɟo ǝzᴉs ǝᵷuɐɥƆ</string>
|
||||
<string name="mcl_setting_title_javaargs">sʇuǝɯnᵷɹɐ ɥɔunɐꞀ WɅՐ</string>
|
||||
<string name="mcl_setting_subtitle_javaargs">˙ǝᵷpǝꞁʍouʞ ʇnoɥʇᴉʍ pǝᴉɟᴉpoɯ ɟᴉ ɥsɐɹɔ ǝɯɐᵷ ǝʞɐɯ ʎɐɯ sᴉɥʇ \'ꞁnɟǝɹɐɔ ǝᗺ</string>
|
||||
<string name="mcl_setting_category_general">sᵷuᴉʇʇǝs ꞁɐɹǝuǝ⅁</string>
|
||||
<string name="mcl_setting_category_scaling">sᵷuᴉʇʇǝs ᵷuᴉꞁɐɔS</string>
|
||||
<string name="mcl_setting_category_renderer">ɹǝɹǝpuǝᴚ</string>
|
||||
<string name="mcl_setting_renderer_virgl">Ɛ˙߈ Ꞁ⅁uǝdO sʇɹodxǝ :(Ɛ SƎ Ꞁ⅁uǝdO) ɹǝɹǝpuǝɹꞁᵷɹᴉʌ</string>
|
||||
<string name="mcl_setting_renderer_vgpu">0˙Ɛ Ꞁ⅁uǝdO sʇɹodxǝ :(Ɛ SƎ Ꞁ⅁uǝdO) ndᵷʌ</string>
|
||||
<string name="mcl_setting_renderer_vulkan_zink">9˙߈ Ꞁ⅁uǝdO sʇɹodxǝ :(uɐʞꞁnɅ) ʞuᴉz</string>
|
||||
<string name="mcl_setting_category_veroption">ʇsᴉꞁ uoᴉsɹǝʌ uᴉ ǝq ꞁꞁᴉʍ ǝdʎʇ uoᴉsɹǝɅ</string>
|
||||
<string name="mcl_setting_veroption_release">ǝsɐǝꞁǝᴚ</string>
|
||||
<string name="mcl_setting_veroption_snapshot">ʇoɥsdɐuS</string>
|
||||
<string name="mcl_setting_veroption_oldalpha">ɐɥdꞁɐ-pꞁO</string>
|
||||
<string name="mcl_setting_veroption_oldbeta">ɐʇǝq-pꞁO</string>
|
||||
<string name="mcl_version_clone">ǝuoꞁƆ</string>
|
||||
<!-- Global strings -->
|
||||
<string name="global_edit">ʇᴉpƎ</string>
|
||||
<string name="global_error">ɹoɹɹƎ</string>
|
||||
<string name="global_warinng">ᵷuᴉuɹɐM</string>
|
||||
<string name="global_load">pɐoꞀ</string>
|
||||
<string name="global_name">ǝɯɐN</string>
|
||||
<string name="global_remove">ǝʌoɯǝᴚ</string>
|
||||
<string name="global_clone">ǝuoꞁƆ</string>
|
||||
<string name="global_restart">ʇɹɐʇsǝᴚ</string>
|
||||
<string name="global_save">ǝʌɐS</string>
|
||||
<string name="global_unpacking">%s ᵷuᴉʞɔɐdu∩</string>
|
||||
<string name="global_error_field_empty">ʎʇdɯǝ ǝq ʇ,uɐɔ pꞁǝᴉɟ sᴉɥ⟘</string>
|
||||
<string name="global_waiting">ʇᴉɐM</string>
|
||||
<!-- MainActivity: strings -->
|
||||
<string name="mcn_exit_title">sꞁᴉɐʇǝp ǝɹoɯ ɹoɟ ʇxʇ˙ᵷoꞁʇsǝʇɐꞁ ʞɔǝɥɔ \'%d ǝpoɔ ɥʇᴉʍ pǝʇᴉxǝ ǝɯɐ⅁/uoᴉʇɐɔᴉꞁddⱯ</string>
|
||||
<string name="mcn_exit_call">ʇᴉxƎ</string>
|
||||
<string name="mcn_exit_confirm">¿ǝsoꞁɔ ǝɔɹoɟ oʇ ʇuɐʍ ǝɹns noʎ ǝɹⱯ</string>
|
||||
<string name="mcn_check_fail_lwjgl">¡pǝꞁꞁɐʇsuᴉ ʇou sɐʍ ƐꞀ⅁ՐMꞀ</string>
|
||||
<string name="mcn_check_fail_vulkan_support">¡ǝɔᴉʌǝp sᴉɥʇ uo pǝʇɹoddns ʇou sᴉ ɹǝɹǝpuǝɹ ʞuᴉZ uɐʞꞁnɅ</string>
|
||||
<!-- MainActivity: Control buttons -->
|
||||
<string name="control_toggle">I∩⅁</string>
|
||||
<string name="control_keyboard">pɹɐoqʎǝꞰ</string>
|
||||
<string name="control_chat">ʇɐɥƆ</string>
|
||||
<string name="control_debug">ᵷnqǝᗡ</string>
|
||||
<string name="control_primary">ᴉɹԀ</string>
|
||||
<string name="control_secondary">ɔǝS</string>
|
||||
<string name="control_inventory">ʌuI</string>
|
||||
<string name="control_thirdperson">pɹƐ</string>
|
||||
<string name="control_listplayers">qɐ⟘</string>
|
||||
<string name="control_mouse">ǝsnoW</string>
|
||||
<string name="control_mouseoff">ɟɟo :ǝsnoW</string>
|
||||
<string name="control_mouseon"> uo :ǝsnoW</string>
|
||||
<!-- MainActivity: Menu advanced controls -->
|
||||
<string name="control_forceclose">ǝsoꞁɔ ǝɔɹoℲ</string>
|
||||
<string name="control_viewout">ʇndʇno ᵷoꞀ</string>
|
||||
<string name="control_adebug">ᵷnqǝᗡ ʇnduI</string>
|
||||
<string name="control_customkey">ǝpoɔʎǝʞ ɯoʇsnɔ puǝS</string>
|
||||
<string name="control_scaleup">dn ǝlɐɔS</string>
|
||||
<string name="control_scaledown">uʍop ǝlɐɔS</string>
|
||||
<!-- ImportControlActivity Strings -->
|
||||
<string name="import_control_label">sloɹʇuoɔ ʇɹodɯI</string>
|
||||
<string name="import_control_invalid_file">ǝlᴉɟ pǝʇdnɹɹoɔ ɹo pᴉlɐʌuI</string>
|
||||
<string name="import_control_import_button">sloɹʇuoɔ ʇɹodɯᴉ</string>
|
||||
<string name="import_control_verifying_file">…uᴉɐᵷɐ ʎɹʇ puɐ ʇᴉɐʍ ǝsɐǝꞁd \'pǝᴉɟᴉɹǝʌ ᵷuᴉǝq sᴉ ǝꞁᴉℲ</string>
|
||||
<string name="import_control_invalid_name">sʇsᴉxǝ ʎpɐǝɹꞁɐ ǝꞁᴉɟ ɹo ǝɯɐu pᴉꞁɐʌuI</string>
|
||||
<string name="import_control_done">ǝuop uoᴉʇɐʇɹodɯI</string>
|
||||
<!--
|
||||
<string name="control_more3"></string>
|
||||
<string name="control_more4"></string>
|
||||
-->
|
||||
<string name="customctrl_edit">%s ᵷuᴉʇᴉpƎ</string>
|
||||
<string name="customctrl_remove">¿%s ǝʌoɯǝᴚ</string>
|
||||
<string name="customctrl_keyname">ǝpoɔʎǝꞰ</string>
|
||||
<string name="customctrl_toggle">ǝꞁqɐǝꞁᵷᵷo⟘</string>
|
||||
<string name="customctrl_size">ǝzᴉS</string>
|
||||
<string name="customctrl_size_width">ɥʇpᴉM</string>
|
||||
<string name="customctrl_size_height">ʇɥᵷᴉǝH</string>
|
||||
<string name="customctrl_mapping">ᵷuᴉddɐW</string>
|
||||
<string name="customctrl_orientation">uoᴉʇɐʇuǝᴉɹO</string>
|
||||
<string name="customctrl_background_color">ɹoꞁoɔ punoɹᵷʞɔɐᗺ</string>
|
||||
<string name="customctrl_corner_radius">snᴉpɐɹ ɹǝuɹoƆ</string>
|
||||
<string name="customctrl_stroke_width">ɥʇpᴉʍ ǝʞoɹʇS</string>
|
||||
<string name="customctrl_stroke_color">ɹoꞁoɔ ǝʞoɹʇS</string>
|
||||
<string name="customctrl_dynamicpos">uoᴉʇᴉsod ɔᴉɯɐuʎᗡ ꞁɐnuɐW</string>
|
||||
<string name="customctrl_dynamicpos_x">X ɔᴉɯɐuʎᗡ</string>
|
||||
<string name="customctrl_dynamicpos_y">⅄ ɔᴉɯɐuʎᗡ</string>
|
||||
<string name="customctrl_transparency_bg">ʎɔuǝɹɐdsuɐɹʇ punoɹᵷʞɔɐᗺ</string>
|
||||
<string name="customctrl_button_opacity">ʎʇᴉɔɐdO uoʇʇnᗺ</string>
|
||||
<string name="customctrl_keycombine">uoᴉʇɐuᴉqɯoɔ ʎǝꞰ</string>
|
||||
<string name="customctrl_addbutton">uoʇʇnq ppⱯ</string>
|
||||
<string name="customctrl_addbutton_drawer">ɹǝʍɐɹp uoʇʇnq pp∀</string>
|
||||
<string name="customctrl_addsubbutton">uoʇʇnq-qns pp∀</string>
|
||||
<string name="customctrl_add_subbutton_message">¡ pǝppɐ uǝǝq sɐɥ %d°u uoʇʇnq-qnS</string>
|
||||
<string name="customctrl_selectdefault">uosɾ ꞁoɹʇuoƆ ʇꞁnɐɟǝp ʇɔǝꞁǝS</string>
|
||||
<string name="main_install_jar_file">ɹɐɾ˙ ꞁꞁɐʇsuI</string>
|
||||
<string name="main_options">suoᴉʇdO</string>
|
||||
<string name="main_play">ʎɐꞁԀ</string>
|
||||
<string name="main_welcome">%s \'ǝɯoɔꞁǝM</string>
|
||||
<string name="main_infodev">(ɅƎᗡ) oɟuI</string>
|
||||
<string name="main_switchuser">ɹǝsn ɥɔʇᴉʍS</string>
|
||||
<string name="main_version">:uoᴉsɹǝɅ</string>
|
||||
<string name="main_nocrash">pǝʇɔǝʇǝp ɥsɐɹɔ oN</string>
|
||||
<string name="main_nolog">˙ᵷoꞁ oN</string>
|
||||
<string name="main_no_news_feed">¡ pǝǝɟ sʍǝu ǝɥʇ ɥɔʇǝɟ oʇ pǝꞁᴉɐℲ</string>
|
||||
<string name="auto_ram_subtitle">ɹǝʇsnɾpɐ WⱯᴚ ɔᴉʇɐɯoʇnɐ sǝꞁqɐuƎ</string>
|
||||
<string name="auto_ram_title">WⱯᴚ oʇnⱯ</string>
|
||||
<string name="autoram_info_msg">ᗺW %d oʇ ʇǝs ʎɹoɯǝW</string>
|
||||
<string name="mcl_setting_check_libraries">ᵷuᴉpɐoꞁuʍop ɹǝʇɟɐ sǝᴉɹɐɹqᴉꞁ ʞɔǝɥƆ</string>
|
||||
<string name="mcl_setting_check_libraries_subtitle">˙spɐoꞁuʍop uǝʞoɹq sʇuǝʌǝɹԀ ˙ǝꞁqɐꞁᴉɐʌɐ s,ʇᴉ ɟᴉ ɥsɐɥ ʎɹɐɹqᴉꞁ ǝɥʇ ʞɔǝɥɔ oʇ ɹǝɥɔunɐꞁ sǝɔɹoɟ uoᴉʇdo sᴉɥ⟘</string>
|
||||
<string name="dl_library_sha_fail">pǝpɐoꞁuʍopǝɹ ǝq ꞁꞁᴉʍ puɐ pǝᵷɐɯɐp sᴉ %s ʎɹɐɹqᴉꞀ</string>
|
||||
<string name="dl_library_sha_unknown">pooᵷ s,ʇᴉ ǝɯnssɐ oʇ ǝʌɐɥ \'pǝʞɔǝɥɔ ǝq ʇ,uɐɔ %s ʎɹɐɹqᴉꞀ</string>
|
||||
<string name="dl_library_sha_pass">ǝꞁqɐsn puɐ ǝuᴉɟ sᴉ %s ʎɹɐɹqᴉꞀ</string>
|
||||
<string name="mcl_disable_gestures">sǝɹnʇsǝᵷ ǝꞁqɐsᴉᗡ</string>
|
||||
<string name="mcl_disable_gestures_subtitle">˙ʞɔoꞁq ɐ ǝɔɐꞁd oʇ dɐʇ puɐ \'ʞɔoꞁq ʞɐǝɹq oʇ pꞁoɥ sɐ ɥɔns \'sǝɹnʇsǝᵷ sǝꞁqɐsᴉᗡ</string>
|
||||
<string name="mcl_setting_title_mousespeed">pǝǝdS ǝsnoW</string>
|
||||
<string name="mcl_setting_subtitle_mousespeed">ǝsnoɯ ǝɹɐʍʇɟos ǝɥʇ ɟo pǝǝds ǝɥʇ sǝᵷuɐɥƆ</string>
|
||||
<string name="customctrl_passthru">nɹɥʇ-ssɐd ǝsnoW</string>
|
||||
<string name="customctrl_swipeable">ǝꞁqɐǝdᴉʍS</string>
|
||||
<string name="customctrl_rounded">pǝpunoᴚ</string>
|
||||
<string name="memory_warning_msg">˙sǝɥsɐɹɔ ǝɯɐᵷ ǝɥʇ ɟᴉ uoᴉʇɐɔoꞁꞁɐ ǝɥʇ ǝᵷuɐɥƆ ˙sǝɥsɐɹɔ oʇ pɐǝꞁ ʎɐɯ ɥɔᴉɥʍ \'(%d) WⱯᴚ pǝʇɐɔoꞁꞁɐ uɐɥʇ ɹǝʍoꞁ sᴉ (%d) WⱯᴚ ǝǝɹɟ ɟo ʇunoɯɐ ʇuǝɹɹnɔ ǝɥ⟘</string>
|
||||
<string name="mcl_memory_allocation">uoᴉʇɐɔoꞁꞁɐ ʎɹoɯǝW</string>
|
||||
<string name="mcl_memory_allocation_subtitle">ʇɟɐɹɔǝuᴉW oʇ uǝʌᴉᵷ sᴉ ʎɹoɯǝɯ ɥɔnɯ ʍoɥ sꞁoɹʇuoƆ</string>
|
||||
<string name="multirt_runtime_corrupt">ǝɯᴉʇunᴚ ɐʌɐՐ pǝʇdnɹɹoƆ</string>
|
||||
<string name="multirt_runtime_incompatiblearch"> %s :ǝɹnʇɔǝʇᴉɥɔɹɐ ǝlqᴉʇɐdɯoɔuI</string>
|
||||
<string name="multirt_config_title">sWɅ ɐʌɐՐ</string>
|
||||
<string name="multirt_config_add">ʍǝu pp∀</string>
|
||||
<string name="multirt_config_add_subtitle">WɅ ɐʌɐՐ ʍǝu ʇɹodɯI</string>
|
||||
<string name="multirt_title">ɹǝᵷɐuɐW ǝɯᴉʇunᴚ</string>
|
||||
<string name="multirt_subtitle">sWɅ ɐʌɐՐ pǝꞁꞁɐʇsuᴉ ǝᵷɐuɐW</string>
|
||||
<string name="multirt_progress_caching">˙˙˙ᵷuᴉɥɔɐƆ</string>
|
||||
<string name="multirt_config_setdefault">ʇꞁnɐɟǝp ʇǝS</string>
|
||||
<string name="multirt_config_setdefault_already">ʇꞁnɐɟǝᗡ</string>
|
||||
<string name="multirt_config_removeerror_last">pǝꞁꞁɐʇsuᴉ ǝɯᴉʇunᴚ ɐʌɐՐ ǝuo ʇsɐǝꞁ ʇɐ ǝʌɐɥ ʇsnɯ no⅄</string>
|
||||
<string name="multirt_nocompartiblert">˙ɹǝʍǝu ɹo %d ɐʌɐſ sǝɹᴉnbǝɹ uoᴉsɹǝʌ sᴉɥ┴ ˙ǝɯᴉʇunɹ ɐʌɐſ ǝlqᴉʇɹɐdɯoɔ ʎuɐ puᴉɟ ʇ,uɐƆ</string>
|
||||
<string name="multirt_nojava8rt">˙8 ɐʌɐſ llɐʇsuᴉ oʇ pǝǝu noʎ \'uoᴉʇdo sᴉɥʇ ǝsn oʇ ɹǝpɹo uI ˙8 ɐʌɐſ puᴉɟ ʇ,uɐƆ</string>
|
||||
<string name="compat_11x_playanyway">ʎɐʍʎuɐ ʎɐlԀ</string>
|
||||
<string name="pvc_gameDirectory">ʎɹoʇɔǝɹᴉp ǝɯɐ⅁</string>
|
||||
<string name="pvc_jvmArgs">sʇuǝɯnᵷɹɐ WɅՐ</string>
|
||||
<string name="pvc_title">sᵷuᴉʇʇǝs uoᴉsɹǝʌ-ɹǝԀ</string>
|
||||
<string name="storage_warning_title">sǝᵷuɐɥɔ ǝᵷɐɹoʇS</string>
|
||||
<string name="storage_warning_text"><![CDATA[˙ʎllɐnuɐɯ </b>ɹǝɥɔunɐ˥ʌɐɾoԀ/sǝɯɐƃ<b> ʇɐ ɹǝploɟ lɐuᴉƃᴉɹo ǝɥʇ ɯoɹɟ ƃuᴉɥʇʎɹǝʌǝ ʎdoɔ ǝsɐǝld \'sǝlᴉɟ ǝɯɐƃ ɹnoʎ ʎdoɔ oʇ pǝǝu noʎ ɟI <br />˙(ɹǝɹoldxǝ ǝlᴉɟ ɹnoʎ uᴉ ɹǝpᴉʌoɹd ǝƃɐɹoʇs ɐ ƃuᴉsn ǝlqᴉssǝɔɔɐ oslɐ) </b>/sǝlᴉɟ/%s/ɐʇɐp/pᴉoɹpu∀<b> sᴉ sǝlᴉɟ ʌɐɾoԀ ɹoɟ ɹǝploɟ ʍǝu ǝɥ┴ <br />˙ɹǝploɟ ǝʇɐʌᴉɹd-ddɐ uɐ oʇuᴉ ʎɹoʇɔǝɹᴉp ǝɯɐƃ ǝɥʇ ǝʌoɯ oʇ pǝɹᴉnbǝɹ ǝɹɐ ǝʍ \'ɹǝɥƃᴉɥ puɐ 0Ɩ pᴉoɹpu∀ uᴉ pǝppɐ sʇuǝɯǝɔɹoɟuǝ ǝƃɐɹoʇs pǝdoɔs ʍǝu s,\ǝlƃooפ oʇ ǝnp]]></string>
|
||||
<string name="control_offset_title">ʇǝsɟɟo ꞁoɹʇuoƆ</string>
|
||||
<string name="control_top_offset"> :ʇǝsɟɟo do⟘</string>
|
||||
<string name="control_right_offset"> :ʇǝsɟɟo ʇɥᵷᴉɹ</string>
|
||||
<string name="control_bottom_offset"> :ʇǝsɟɟo ɯoʇʇoq</string>
|
||||
<string name="control_left_offset"> :ʇǝsɟɟo ʇɟǝꞁ</string>
|
||||
<string name="preference_control_offset_title">sʇǝsɟɟo ǝpᴉs ꞁoɹʇuoƆ</string>
|
||||
<string name="preference_control_offset_description">uǝǝɹɔs ǝɥʇ ɟo ǝpᴉs ɥɔɐǝ oʇ ʇǝsɟɟo ɯoʇsnɔ ɐ ʇǝS</string>
|
||||
<string name="preference_mouse_start_title">uo ǝsnoɯ lɐnʇɹᴉʌ ɥʇᴉʍ ʇɹɐʇS</string>
|
||||
<string name="preference_mouse_start_description">ʎɐlnoq-sɐᴉɥʇɐW ʎq pǝƃpnɾ noʎ ʇǝƃ llᴉʍ uoᴉʇdo sᴉɥʇ ƃuᴉs∩</string>
|
||||
<string name="preference_video_title">ɹǝɹǝpuǝɹ puɐ oǝpᴉɅ</string>
|
||||
<string name="preference_video_description">ɹǝɹǝpuǝɹ puɐ \'ǝdʎʇ ᵷuᴉꞁɐɔs \'uoᴉʇnꞁosǝᴚ</string>
|
||||
<string name="preference_control_title">uoᴉʇɐzᴉɯoʇsnɔ ꞁoɹʇuoƆ</string>
|
||||
<string name="preference_control_description">ᵷuᴉꞁɐɔs puɐ \'sɹǝᵷᵷᴉɹʇ \'sǝdʎʇ sǝɹnʇsǝ⅁</string>
|
||||
<string name="preference_java_title">sʞɐǝʍ⟘ ɐʌɐՐ</string>
|
||||
<string name="preference_java_description">ʇunoɯɐ WⱯᴚ puɐ \'sʇuǝɯnᵷɹⱯ WɅՐ \'suoᴉsɹǝʌ ɐʌɐՐ</string>
|
||||
<string name="preference_misc_title">sᵷuᴉʇʇǝs snoǝuɐꞁꞁǝɔsᴉW</string>
|
||||
<string name="preference_misc_description">sʞɔǝɥɔ sqᴉꞁ puɐ \'ʇsᴉꞁ uoᴉsɹǝɅ</string>
|
||||
<string name="preference_experimental_title">ɟɟnʇS ꞁɐʇuǝɯᴉɹǝdxƎ</string>
|
||||
<string name="preference_experimental_description">˙ʇɹoddns ou \'uoᴉʇɐɹǝpᴉsuoɔ ɥʇᴉʍ ǝɹǝɥʇ sᵷuᴉɥʇ ǝs∩</string>
|
||||
<string name="preference_sustained_performance_title">ǝpoɯ ǝɔuɐɯɹoɟɹǝd pǝuᴉɐʇsns ǝꞁqɐuƎ</string>
|
||||
<string name="preference_sustained_performance_description">ǝɔuɐɯɹoɟɹǝd ʞɐǝd ᵷuᴉʇᴉɯᴉꞁ ʎq ᵷuᴉꞁʇʇoɹɥʇ ꞁɐɯɹǝɥʇ ʇᴉɯᴉꞀ</string>
|
||||
<string name="preference_back_title">uǝǝɹɔs ʇsɐꞁ ǝɥʇ oʇ ʞɔɐᗺ</string>
|
||||
<string name="gles_hack_title">ʞɔɐɥ ʞuᴉɹɥS SƎㄣ˥פ</string>
|
||||
<string name="gles_hack_none">sǝɹnʇxǝʇ ʞuᴉɹɥs ʇ,uop</string>
|
||||
<string name="gles_hack_always">ᄅ ʎq sǝɹnʇxǝʇ llɐ sǝpᴉʌᴉp</string>
|
||||
<string name="gles_hack_sometimes">ㄣ/ ɹo ᄅ/ ʎq sǝɹnʇxǝʇ ƃᴉq sǝpᴉʌᴉp</string>
|
||||
<string name="unnamed">pǝɯɐuu∩</string>
|
||||
<string name="profiles_latest_snapshot">ʇoɥsdɐus ʇsǝʇɐ˥</string>
|
||||
<string name="profiles_latest_release">ǝsɐǝlǝɹ ʇsǝʇɐ˥</string>
|
||||
<string name="profiles_editing">ǝlᴉɟoɹd ƃuᴉʇᴉpƎ</string>
|
||||
<string name="profiles_profile_name">ǝɯɐN</string>
|
||||
<string name="profiles_profile_version">uoᴉsɹǝΛ</string>
|
||||
<string name="global_delete">ǝʇǝlǝp</string>
|
||||
<string name="pedit_java_runtime">ǝɯᴉʇunɹ ɐʌɐſ</string>
|
||||
<string name="pedit_renderer">ɹǝɹǝpuǝᴚ</string>
|
||||
<string name="arc_capes_title">sǝdɐɔ ɐɔıʇǝɯsoɔ</string>
|
||||
<string name="arc_capes_desc">˙ǝuıɟıʇdo sǝɹınbǝɹ ˙ɔɔ˙ɐɔıʇǝɯsoɔ//:sdʇʇɥ ʇısıʌ ǝsɐǝld uoıʇɐɯɹoɟuı ǝɹoɯ ɹoɟ ˙(ɔɹɐ ʎlsnoıʌǝɹd) ɐɔıʇǝɯsoɔ ɯoɹɟ sǝdɐɔ sǝlqɐuǝ</string>
|
||||
<string name="migrated_profile_str">uoᴉʇɐɹnƃᴉɟuoɔ uoᴉsɹǝʌ %s</string>
|
||||
</resources>
|
||||
2
gl4es
2
gl4es
Submodule gl4es updated: 37452ff0dc...b675669fbd
@@ -689,12 +689,6 @@ public class GLFW
|
||||
if (cbfun == null) mGLFWFramebufferSizeCallback = null;
|
||||
else mGLFWFramebufferSizeCallback = GLFWFramebufferSizeCallback.createSafe(nglfwSetFramebufferSizeCallback(window, memAddressSafe(cbfun)));
|
||||
|
||||
mGLFWFramebufferSizeCallback = GLFWFramebufferSizeCallback.createSafe(nglfwSetFramebufferSizeCallback(window, memAddressSafe(cbfun)));
|
||||
|
||||
try {
|
||||
mGLFWFramebufferSizeCallback.invoke(window, mGLFWWindowWidth, mGLFWWindowHeight);
|
||||
} catch (Throwable th) {}
|
||||
|
||||
return lastCallback;
|
||||
}
|
||||
|
||||
@@ -798,12 +792,6 @@ public class GLFW
|
||||
if (cbfun == null) mGLFWWindowSizeCallback = null;
|
||||
else mGLFWWindowSizeCallback = GLFWWindowSizeCallback.createSafe(nglfwSetWindowSizeCallback(window, memAddressSafe(cbfun)));
|
||||
|
||||
mGLFWWindowSizeCallback = GLFWWindowSizeCallback.createSafe(nglfwSetWindowSizeCallback(window, memAddressSafe(cbfun)));
|
||||
|
||||
try {
|
||||
mGLFWWindowSizeCallback.invoke(window, mGLFWWindowWidth, mGLFWWindowHeight);
|
||||
} catch (Throwable th) {}
|
||||
|
||||
return lastCallback;
|
||||
}
|
||||
|
||||
@@ -922,10 +910,9 @@ public class GLFW
|
||||
@NativeType("GLFWvidmode const *")
|
||||
public static GLFWVidMode.Buffer glfwGetVideoModes(@NativeType("GLFWmonitor *") long monitor) {
|
||||
MemoryStack stack = stackGet(); int stackPointer = stack.getPointer();
|
||||
IntBuffer count = stack.callocInt(1);
|
||||
try {
|
||||
// long __result = nglfwGetVideoModes(monitor, memAddress(count));
|
||||
long __result = memAddress(stack.callocLong(1));
|
||||
long __result = glfwGetVideoMode(monitor).address();
|
||||
return GLFWVidMode.createSafe(__result, 1);
|
||||
} finally {
|
||||
stack.setPointer(stackPointer);
|
||||
|
||||
@@ -19,8 +19,7 @@ public static int getControllerCount() {
|
||||
ctrlr.poll();
|
||||
}
|
||||
public static boolean next() {
|
||||
ctrlr.poll();
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public static boolean isCreated() {
|
||||
return true;
|
||||
|
||||
@@ -953,7 +953,7 @@ public class Display {
|
||||
} else {
|
||||
glfwSetWindowIcon(Window.handle, new GLFWImage.Buffer(icons[0]));
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
} catch (Exception e) {
|
||||
LWJGLUtil.log("Couldn't set icon");
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -986,8 +986,10 @@ public class Display {
|
||||
}
|
||||
|
||||
public static void setDisplayModeAndFullscreen(DisplayMode dm) throws LWJGLException {
|
||||
Display.mode = dm;
|
||||
GLFW.glfwSetWindowSize(Window.handle, dm.getWidth(), dm.getHeight());
|
||||
if(Window.handle != 0) {
|
||||
Display.mode = dm;
|
||||
GLFW.glfwSetWindowSize(Window.handle, dm.getWidth(), dm.getHeight());
|
||||
}
|
||||
}
|
||||
|
||||
public static void setFullscreen(boolean fullscreen) throws LWJGLException {
|
||||
|
||||
Reference in New Issue
Block a user