Skip to content

Instantly share code, notes, and snippets.

@jaehee0507
Created August 13, 2015 22:59
Show Gist options
  • Save jaehee0507/a21b75ea7d141607c5f4 to your computer and use it in GitHub Desktop.
Save jaehee0507/a21b75ea7d141607c5f4 to your computer and use it in GitHub Desktop.
A source of Single Potion Addon
#include <dlfcn.h>
#include <jni.h>
#include <string>
#include <functional>
#include <vector>
#include <stdlib.h>
#include <android/log.h>
#include "mcpelauncher.h"
using namespace std;
class Player;
class MinecraftClient;
class RakNetInstance;
class MobEffectInstance {
public:
char filler[16];
public:
MobEffectInstance(int, int, int);
};
class Token {
public:
string const& getText(string const&) const;
int getValue(int) const;
};
class ServerCommandParser {
public:
void addCommand(string const&, string const&, function<string (vector<Token> const&)> const&);
};
Player* player = NULL;
bool isInServer = false;
void (*Mob_addEffect)(Player*, MobEffectInstance const&);
void applyEffect(int effect, int time, int level) {
Mob_addEffect(player, MobEffectInstance(effect, time*20, level-1));
}
void (*Mob_removeEffect)(Player*, int);
void (*Mob_removeEffectParticles)(Player*);
void removeEffect() {
for(int i = 1; i <= 23; i++)
Mob_removeEffect(player, i);
Mob_removeEffectParticles(player);
}
void (*MinecraftClient_onPlayerLoaded_real)(MinecraftClient*, Player&);
void MinecraftClient_onPlayerLoaded_Hook(MinecraftClient* thiz, Player& player) {
::player = &player;
MinecraftClient_onPlayerLoaded_real(thiz, player);
}
string effectFunc(vector<Token> const& args) {
if(isInServer)
return "§4You cannot use this command in server";
string effect = args[16].getText("null");
int time = args[32].getValue(0);
int level = args[48].getValue(0);
if(effect == "speed" || effect == "1")
effect = "1";
else if(effect == "slowness" || effect == "2")
effect = "2";
else if(effect == "haste" || effect == "3")
effect = "3";
else if(effect == "mining_fatigue" || effect == "4")
effect = "4";
else if(effect == "strength" || effect == "5")
effect = "5";
else if(effect == "instant_health" || effect == "6")
effect = "6";
else if(effect == "instant_damage" || effect == "7")
effect = "7";
else if(effect == "jump" || effect == "8")
effect = "8";
else if(effect == "nausea" || effect == "9")
effect = "9";
else if(effect == "regeneration" || effect == "10")
effect = "10";
else if(effect == "damage_resistance" || effect == "11")
effect = "11";
else if(effect == "fire_resistance" || effect == "12")
effect = "12";
else if(effect == "water_breathing" || effect == "13")
effect = "13";
else if(effect == "invisibility" || effect == "14")
effect = "14";
else if(effect == "blindness" || effect == "15")
effect = "15";
else if(effect == "night_vision" || effect == "16")
effect = "16";
else if(effect == "hunger" || effect == "17")
effect = "17";
else if(effect == "weakness" || effect == "18")
effect = "18";
else if(effect == "poison" || effect == "19")
effect = "19";
else if(effect == "wither" || effect == "20")
effect = "20";
else if(effect == "health_boost" || effect == "21")
effect = "21";
else if(effect == "absorption" || effect == "22")
effect = "22";
else if(effect == "saturation" || effect == "23")
effect = "23";
else
return "§4Cannot find effect : "+effect;
applyEffect(atoi(effect.c_str()), time, level);
return "§6Successfully applied effect";
}
string clearFunc(vector<Token> const& args) {
removeEffect();
return "§6Successfully removed effects";
}
string whomadeitFunc(vector<Token> const& args) {
return "§eAffogatoman(@dfak0557)";
}
void (*MinecraftClient_setupCommandParser_real)(MinecraftClient*, ServerCommandParser&);
void MinecraftClient_setupCommandParser_Hook(MinecraftClient* thiz, ServerCommandParser& parser) {
parser.addCommand("effect", "snn", effectFunc);
parser.addCommand("clear", "", clearFunc);
parser.addCommand("whomadeit", "", whomadeitFunc);
MinecraftClient_setupCommandParser_real(thiz, parser);
}
void (*MinecraftClient_leaveGame_real)(MinecraftClient*, bool);
void MinecraftClient_leaveGame_Hook(MinecraftClient* thiz, bool idk) {
isInServer = false;
MinecraftClient_leaveGame_real(thiz, idk);
}
void (*RakNetInstance_connect_real)(RakNetInstance*, const char*, int);
void RakNetInstance_connect_Hook(RakNetInstance* thiz, const char* ip, int port) {
isInServer = true;
RakNetInstance_connect_real(thiz, ip, port);
}
JNIEXPORT jint JNI_OnLoad(JavaVM * vm, void * reserved) {
Mob_addEffect = (void (*)(Player*, MobEffectInstance const&)) dlsym(RTLD_DEFAULT, "_ZN3Mob9addEffectERK17MobEffectInstance");
Mob_removeEffect = (void (*)(Player*, int)) dlsym(RTLD_DEFAULT, "_ZN3Mob12removeEffectEi");
Mob_removeEffectParticles = (void (*)(Player*)) dlsym(RTLD_DEFAULT, "_ZN3Mob21removeEffectParticlesEv");
void* load = dlsym(RTLD_DEFAULT, "_ZN15MinecraftClient14onPlayerLoadedER6Player");
mcpelauncher_hook(load, (void*) &MinecraftClient_onPlayerLoaded_Hook, (void**) &MinecraftClient_onPlayerLoaded_real);
void* setup = dlsym(RTLD_DEFAULT, "_ZN15MinecraftClient18setupCommandParserER19ServerCommandParser");
mcpelauncher_hook(setup, (void*) &MinecraftClient_setupCommandParser_Hook, (void**) &MinecraftClient_setupCommandParser_real);
void* leave = dlsym(RTLD_DEFAULT, "_ZN15MinecraftClient9leaveGameEb");
mcpelauncher_hook(leave, (void*) &MinecraftClient_leaveGame_Hook, (void**) &MinecraftClient_leaveGame_real);
void* multi = dlsym(RTLD_DEFAULT, "_ZN14RakNetInstance7connectEPKci");
mcpelauncher_hook(multi, (void*) &RakNetInstance_connect_Hook, (void**) &RakNetInstance_connect_real);
return JNI_VERSION_1_2;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment