Guest User

Untitled

a guest
Sep 12th, 2014
715
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Too Many Items mod by @MCMrARM
  3. Do *NOT* redistribute source code or biniares, do *NOT* make software based on it.
  4. */
  5.  
  6. #include <jni.h>
  7. #include "mcpelauncher.h"
  8. #include "UILib.cpp"
  9. #include "colors.h"
  10. #include "elements/GUILabel.cpp"
  11. #include "elements/GUIButton.cpp"
  12. #include "elements/GUIToggleButton.cpp"
  13. #include "elements/GUIHeader.cpp"
  14. #include "elements/GUIItem.cpp"
  15. #include <android/log.h>
  16. #include <dlfcn.h>
  17. #include <string>
  18. #include <sstream>
  19. #include <stdlib.h>
  20. #include <cmath>
  21.  
  22. typedef void* MCPE_Inventory;
  23. typedef void* MCPE_Player;
  24.  
  25. MCPE_ItemInstance* createItemInstance(int id, int count, int damage) {
  26. MCPE_ItemInstance* item = new MCPE_ItemInstance();
  27. item->damage = damage;
  28. item->count = count;
  29. MCPE_ItemInstance_setId(item, id);
  30. return item;
  31. }
  32.  
  33. MCPE_Inventory* MCPE_Inventory_instance;
  34. static void (*MCPE_Inventory_add)(MCPE_Inventory*, MCPE_ItemInstance*);
  35.  
  36. MCPE_Item** MCPE_Item_items;
  37.  
  38. JavaVM* jvm;
  39.  
  40. int page;
  41. int pages;
  42. GUILabel* pageText;
  43.  
  44. void changePage(int btn) {
  45. if(btn == 1) {
  46. if(page <= 0) return;
  47. page--;
  48. }else if(btn == 2) {
  49. if(page+1 >= pages) return;
  50. page++;
  51. }
  52.  
  53. std::stringstream newText;
  54. newText << "Page " << (page+1) << "/" << pages;
  55. pageText->setMsg(newText.str());
  56. }
  57.  
  58. void fireBackEvent(int anything) {
  59. if(currentScreen != NULL && currentScreenCustom) {
  60. GUIScreen* screen = (GUIScreen*) currentScreen;
  61. screen->handleBackEvent();
  62. }
  63. }
  64.  
  65. int currentId = 0;
  66. GUILabel* lblItemDmgVal = NULL;
  67. GUILabel* check = NULL;
  68. int currentDmg = 0;
  69. void updateDmg(int id) {
  70. int dmg = id-2;
  71. std::stringstream newText;
  72. newText << dmg;
  73. lblItemDmgVal->setMsg(newText.str());
  74. check->setX(12+dmg*17);
  75. currentDmg = dmg;
  76. }
  77.  
  78. GUILabel* lblItemCountVal = NULL;
  79. int currentCount = 1;
  80. void countBtn(int id) {
  81. if(id == 25) {
  82. // add
  83. currentCount++;
  84. if(currentCount > 1000) currentCount = 1000;
  85. }else if(id == 26) {
  86. // rem
  87. currentCount--;
  88. if(currentCount < 1) currentCount = 1;
  89. }else if(id == 27) {
  90. // 1
  91. currentCount = 1;
  92. }else if(id == 28) {
  93. // 64
  94. currentCount = 64;
  95. }
  96. std::stringstream newText;
  97. newText << currentCount;
  98. lblItemCountVal->setMsg(newText.str());
  99. }
  100.  
  101. void addItem(int anything) {
  102. fireBackEvent(anything);
  103. MCPE_Inventory_add(MCPE_Inventory_instance, createItemInstance(currentId, currentCount, currentDmg));
  104. }
  105.  
  106. class AddItemScreen: public GUIScreen {
  107. int itemId;
  108.  
  109. public:
  110. AddItemScreen(int itemId) : GUIScreen(BACKGROUND_GAME_DARK) {
  111. this->itemId = itemId;
  112.  
  113. currentId = itemId;
  114. GUIHeader* header = new GUIHeader(0, 0, 0, getScreenWidth(), 26, "Add item");
  115. addElement(header);
  116. GUIButton* back = new GUIButton(1, 4, 4, 38, 18, "Back");
  117. back->setClick(fireBackEvent);
  118. addElement(back);
  119. GUILabel* lblItemID = new GUILabel(4, 30, 35, COLOR_WHITE, "Item ID:", true);
  120. addElement(lblItemID);
  121. std::stringstream sid;
  122. sid << itemId;
  123. GUILabel* lblItemIDVal = new GUILabel(42, 30, 50, COLOR_GREEN, sid.str(), true);
  124. addElement(lblItemIDVal);
  125. sid.str("");
  126. sid.clear();
  127. GUILabel* lblItemDmg = new GUILabel(4, 45, 70, COLOR_WHITE, "Item damage:", true);
  128. addElement(lblItemDmg);
  129. currentDmg = 0;
  130. lblItemDmgVal = new GUILabel(68, 45, 50, COLOR_GREEN, "0", true);
  131. addElement(lblItemDmgVal);
  132. for(int ix=0;ix<(getScreenWidth()-8)/17;ix++) {
  133. GUIItem* itemGui = new GUIItem(2+ix, 4+ix*17, 55, itemId, ix);
  134. itemGui->setClick(updateDmg);
  135. addElement(itemGui);
  136. }
  137. check = new GUILabel(12, 63, 20, COLOR_GREEN, "\u2713", true);
  138. addElement(check);
  139. currentCount = 1;
  140. GUILabel* lblItemCount = new GUILabel(4, 78, 30, COLOR_WHITE, "Count:", true);
  141. addElement(lblItemCount);
  142. lblItemCountVal = new GUILabel(36, 78, 50, COLOR_GREEN, "1", true);
  143. addElement(lblItemCountVal);
  144. GUIButton* addCount = new GUIButton(25, 60, 73, 18, 18, "+");
  145. addCount->setClick(countBtn);
  146. addElement(addCount);
  147. GUIButton* remCount = new GUIButton(26, 80, 73, 18, 18, "-");
  148. remCount->setClick(countBtn);
  149. addElement(remCount);
  150. GUIButton* count1 = new GUIButton(27, 105, 73, 18, 18, "1");
  151. count1->setClick(countBtn);
  152. addElement(count1);
  153. GUIButton* count64 = new GUIButton(28, 125, 73, 24, 18, "64");
  154. count64->setClick(countBtn);
  155. addElement(count64);
  156. GUIButton* addBtn = new GUIButton(30, getScreenWidth()/4, getScreenHeight()-40, getScreenWidth()/4*2, 30, "Add");
  157. addBtn->setClick(addItem);
  158. addElement(addBtn);
  159. }
  160.  
  161. bool handleBackEvent();
  162. };
  163.  
  164. jclass mainClass;
  165. void aboutBtn(int id) {
  166. JNIEnv* env;
  167. int envStatus = jvm->GetEnv((void**) &env, JNI_VERSION_1_6);
  168. if (envStatus == JNI_EDETACHED) {
  169. jvm->AttachCurrentThread(&env, NULL);
  170. }
  171.  
  172. const char* url = "https://twitter.com/MCMrARM";
  173. if(id == 4){
  174. url = "http://www.minecraftforum.net/forums/minecraft-pocket-edition/mcpe-mods-tools/1987484-too-many-items-mod";
  175. }
  176.  
  177. jclass uriClass = env->FindClass("android/net/Uri");
  178. jmethodID uriParseID = env->GetStaticMethodID(uriClass, "parse", "(Ljava/lang/String;)Landroid/net/Uri;");
  179. jobject uri = env->CallStaticObjectMethod(uriClass, uriParseID, env->NewStringUTF(url));
  180.  
  181. jclass intentClass = env->FindClass("android/content/Intent");
  182. jmethodID intentConstructor = env->GetMethodID(intentClass, "<init>", "(Ljava/lang/String;Landroid/net/Uri;)V");
  183. jobject intent = env->NewObject(intentClass, intentConstructor, env->NewStringUTF("android.intent.action.VIEW"), uri);
  184.  
  185. jfieldID currentMainField = env->GetStaticFieldID(mainClass, "currentMainActivity", "Ljava/lang/ref/WeakReference;");
  186. jobject mainInstanceWeak = env->GetStaticObjectField(mainClass, currentMainField);
  187.  
  188. jclass refClass = env->FindClass("java/lang/ref/Reference");
  189. jmethodID refGetID = env->GetMethodID(refClass, "get", "()Ljava/lang/Object;");
  190. jobject mainInstance = env->CallObjectMethod(mainInstanceWeak, refGetID);
  191.  
  192. jmethodID startActivityID = env->GetMethodID(mainClass, "startActivity", "(Landroid/content/Intent;)V");
  193. env->CallVoidMethod(mainInstance, startActivityID, intent);
  194.  
  195. if (envStatus == JNI_EDETACHED) {
  196. jvm->DetachCurrentThread();
  197. }
  198. }
  199.  
  200. class AboutScreen: public GUIScreen {
  201. public:
  202. AboutScreen() : GUIScreen(BACKGROUND_GAME_DARK) {
  203. GUIHeader* header = new GUIHeader(0, 0, 0, getScreenWidth(), 26, "About");
  204. addElement(header);
  205. GUIButton* back = new GUIButton(1, 4, 4, 38, 18, "Back");
  206. back->setClick(fireBackEvent);
  207. addElement(back);
  208. GUILabel* lblAbout = new GUILabel(5, 30, getScreenWidth()-10, COLOR_GREEN, "Too Many Items", true);
  209. addElement(lblAbout);
  210. GUILabel* lblAbout2 = new GUILabel(5, 42, getScreenWidth()-10, COLOR_WHITE, "version 8", true);
  211. addElement(lblAbout2);
  212. GUILabel* lblAbout3 = new GUILabel(5, 54, getScreenWidth()-10, COLOR_WHITE, "made by MrARM", true);
  213. addElement(lblAbout3);
  214. GUIButton* twitter = new GUIButton(3, 5, getScreenHeight()-25, (getScreenWidth()-20)/2, 20, "Twitter");
  215. twitter->setClick(aboutBtn);
  216. addElement(twitter);
  217. GUIButton* mcforums = new GUIButton(4, getScreenWidth()/2+5, getScreenHeight()-25, (getScreenWidth()-20)/2, 20, "Minecraft Forums thread");
  218. mcforums->setClick(aboutBtn);
  219. addElement(mcforums);
  220. }
  221.  
  222. bool handleBackEvent();
  223. };
  224.  
  225. void showAbout(int id) {
  226. setScreen(new AboutScreen);
  227. }
  228.  
  229. static std::string (*MCPE_Item_getDescriptionId)(MCPE_Item*);
  230.  
  231. class ListScreen: public GUIScreen {
  232. public:
  233. ListScreen() : GUIScreen(BACKGROUND_GAME_DARK) {
  234. page = 0;
  235. pages = 0;
  236. }
  237.  
  238. void init() {
  239. GUIScreen::init();
  240. GUILabel* lbl = new GUILabel(2, 2, 100, COLOR_GREEN, "Too Many Items", true);
  241. addElement(lbl);
  242. GUILabel* lbl2 = new GUILabel(82, 2, 100, COLOR_GRAY, "by MrARM", true);
  243. addElement(lbl2);
  244. pageText = new GUILabel(56, getScreenHeight()-16, 200, COLOR_GRAY, "Page 0/0", true);
  245. addElement(pageText);
  246. GUIButton* prevBtn = new GUIButton(1, 2, getScreenHeight()-22, 50, 20, "Previous");
  247. prevBtn->setClick(changePage);
  248. addElement(prevBtn);
  249. GUIButton* nextBtn = new GUIButton(2, getScreenWidth()-2-50-2-20, getScreenHeight()-22, 50, 20, "Next");
  250. nextBtn->setClick(changePage);
  251. addElement(nextBtn);
  252. GUIButton* aboutBtn = new GUIButton(2, getScreenWidth()-2-20, getScreenHeight()-22, 20, 20, "?");
  253. aboutBtn->setClick(showAbout);
  254. addElement(aboutBtn);
  255. }
  256.  
  257. bool checkItem(int id) {
  258. if(id == 95) return true;
  259. if(id < 255) {
  260. std::string tileName = MCPE_Item_getDescriptionId(MCPE_Item_items[id]);
  261. std::string missingStart = "tile.Missing block ID: ";
  262. if(tileName.compare(0, missingStart.length(), missingStart) == 0){
  263. return false;
  264. }
  265. return true;
  266. }
  267. return true;
  268. }
  269.  
  270. int getItemCount() {
  271. int items = 0;
  272. for(int i=0;i<512;i++) {
  273. if(MCPE_Item_items[i] != NULL && checkItem(i)) {
  274. items++;
  275. }
  276. }
  277. return items;
  278. }
  279.  
  280. int getRows() {
  281. int top = 14;
  282. int bottom = getScreenHeight()-24;
  283. int height = bottom-top;
  284. return floor(((float) height) / 17);
  285. }
  286.  
  287. int getItemsInRow() {
  288. return (getScreenWidth()-8)/17;
  289. }
  290.  
  291. int getItemsPerPage() {
  292. return getItemsInRow()*getRows();
  293. }
  294.  
  295. void render() {
  296. GUIScreen::render();
  297.  
  298. if(MCPE_Textures_instance != NULL) {
  299. int items = getItemCount();
  300. int perPage = getItemsPerPage();
  301. int newPages = ceil(((float)items)/perPage);
  302. if(pages != newPages) {
  303. page = 0;
  304. pages = newPages;
  305. std::stringstream newText;
  306. newText << "Page " << (page+1) << "/" << pages;
  307. pageText->setMsg(newText.str());
  308. }
  309.  
  310. int start = page*perPage;
  311.  
  312. int id = 0;
  313. int x = 2;
  314. int y = 14;
  315. for(int i=0;i<512;i++) {
  316. if(MCPE_Item_items[i] != NULL && checkItem(i)) {
  317. if(id >= start) {
  318. MCPE_ItemInstance* item = createItemInstance(i, 1, 0);
  319. MCPE_ItemRenderer_renderGuiItem(MCPE_Textures_instance, item, 0, x, y, 1, 1, 1);
  320. x += 17;
  321. if(x >= getScreenWidth()-4-17) {
  322. x = 2;
  323. y += 17;
  324. if(y >= getScreenHeight()-24-17) {
  325. break;
  326. }
  327. }
  328. }
  329. id++;
  330. }
  331. }
  332. }
  333. }
  334.  
  335. bool touchStarted(int id, short x, short y) {
  336. if(x >= 2 && x <= getScreenWidth()-2 && y >= 14 && y <= getScreenHeight()-24) {
  337. int rows = getRows();
  338. for(int xi=0;xi<getItemsInRow();xi++) {
  339. for(int yi=0;yi<rows;yi++) {
  340. if(xi*17 <= x-2 && (xi+1)*17 > x-2 &&
  341. yi*17 <= y-14 && (yi+1)*17 > y-14) {
  342. int start = page*getItemsPerPage();
  343. int iid = 0;
  344. int findId = start+yi*getItemsInRow()+xi;
  345. for(int i=0;i<512;i++) {
  346. if(MCPE_Item_items[i] != NULL && checkItem(i)) {
  347. if(iid == findId) {
  348. //MCPE_Inventory_add(MCPE_Inventory_instance, createItemInstance(i, 1, 0));
  349. setScreen(new AddItemScreen(i));
  350. return true;
  351. }
  352. iid++;
  353. }
  354. }
  355. }
  356. }
  357. }
  358. }
  359. return GUIScreen::touchStarted(id, x, y);
  360. }
  361. };
  362.  
  363. void showList(int btnId) {
  364. setScreen(new ListScreen);
  365. }
  366.  
  367. bool AddItemScreen::handleBackEvent() {
  368. setScreen(new ListScreen);
  369. return true;
  370. }
  371.  
  372. bool AboutScreen::handleBackEvent() {
  373. setScreen(new ListScreen);
  374. return true;
  375. }
  376.  
  377. static void (*MCPE_Inventory_Inventory)(MCPE_Inventory*, MCPE_Player*, bool);
  378. void inventoryHook(MCPE_Inventory* inventory, MCPE_Player* player, bool b) {
  379. MCPE_Inventory_instance = inventory;
  380. MCPE_Inventory_Inventory(inventory, player, b);
  381. }
  382.  
  383. JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
  384. jvm = vm;
  385. JNIEnv* env;
  386. int envStatus = jvm->GetEnv((void**) &env, JNI_VERSION_1_6);
  387. if (envStatus == JNI_EDETACHED) {
  388. jvm->AttachCurrentThread(&env, NULL);
  389. }
  390. jclass mainc = env->FindClass("com/mojang/minecraftpe/MainActivity");
  391. mainClass = (jclass) env->NewGlobalRef(mainc);
  392.  
  393. MCPE_Item_items = (MCPE_Item**) dlsym(RTLD_DEFAULT, "_ZN4Item5itemsE");
  394.  
  395. MCPE_Inventory_add = (void (*)(MCPE_Inventory*, MCPE_ItemInstance*)) dlsym(RTLD_DEFAULT, "_ZN9Inventory3addEP12ItemInstance");
  396. MCPE_Item_getDescriptionId = (std::string (*)(MCPE_Item*)) dlsym(RTLD_DEFAULT, "_ZNK8TileItem16getDescriptionIdEv");
  397.  
  398. setupGUI();
  399.  
  400. GUIBaseScreen* screen = getGUIScreen();
  401. GUIButton* btn = new GUIButton(0, 0, 12, 20, 20, "M");
  402. btn->setClick(showList);
  403. screen->addElement(btn);
  404.  
  405. void* inv = dlsym(RTLD_DEFAULT, "_ZN9InventoryC1EP6Playerb");
  406. mcpelauncher_hook(inv, (void*) &inventoryHook, (void**) &MCPE_Inventory_Inventory);
  407.  
  408. return JNI_VERSION_1_2;
  409. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×