Merge branch 'v3_openjdk' into v3_zink

This commit is contained in:
khanhduytran0
2022-08-22 16:44:30 +07:00
30 changed files with 236 additions and 625 deletions

View File

@@ -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">
[![Android CI](https://github.com/PojavLauncherTeam/PojavLauncher/workflows/Android%20CI/badge.svg)](https://github.com/PojavLauncherTeam/PojavLauncher/actions)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/PojavLauncherTeam/PojavLauncher)](https://github.com/PojavLauncherTeam/PojavLauncher/actions)
[![Crowdin](https://badges.crowdin.net/pojavlauncher/localized.svg)](https://crowdin.com/project/pojavlauncher)
[![Discord](https://img.shields.io/discord/724163890803638273.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/6RpEJda)
[![Reddit](https://img.shields.io/badge/dynamic/json.svg?label=r/PojavLauncher%20member%20count&query=$.data.subscribers&url=https://www.reddit.com/r/PojavLauncher/about.json)](https://reddit.com/r/PojavLauncher)
[![Google Play](https://gist.githubusercontent.com/meefik/54a54afa7cc1dc600bdb855cb7895a4a/raw/ad617c006a1ac28d067c9a87cec60199ca8fef7c/get-it-on-google-play.png)](https://play.google.com/store/apps/details?id=net.kdt.pojavlaunch)
[![Discord](https://img.shields.io/discord/724163890803638273.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/6RpEJda)
[![Twitter Follow](https://img.shields.io/twitter/follow/plaunchteam?color=blue&style=flat-square)](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:
[![Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](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.

View File

Binary file not shown.

View File

@@ -0,0 +1 @@
20220819

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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() {

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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(" ")));

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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{

View File

@@ -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;
}
}

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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");

View File

@@ -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ʇ &lt;/b&gt;,, uᴉ pǝᵷᵷoꞁ ǝɯ dǝǝꞰ,,&lt;b&gt; 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">ɯɐ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

Submodule gl4es updated: 37452ff0dc...b675669fbd

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 {