Forumet er oppdatert og reCAPTCHA er på plass for å redusere spam
Velkommen til Minecraft.atc.noFor informasjon om denne tjenesten, se http://mc.atc.no/ssh
Jeg er usikker på hvordan jeg skal "lure" CraftBukkit/Spigot og plugins til å tro at SSH-brukere er ekte spillere. Det første jeg tenkte var å iscenesette events, men jeg vet ikke om CraftBukkit/Spigot lytter til sine egne events. Noen idéer? Jeg vil helst unngå workarounds som ProtocolLib.
PluginManager pm = plugin.getServer().getPluginManager();Object listeners = getPrivateField(pm, "listeners");if (listeners instanceof EnumMap) { HashMap<Event.Type, SortedSet<RegisteredListener>> tmp = new HashMap<Event.Type, SortedSet<RegisteredListener>>(((Map<Event.Type, SortedSet<RegisteredListener>>) listeners)); tmp.put(Event.Type.valueOf(name), null); setPrivateField(pm, "listeners", tmp);} else ((Map<Event.Type, SortedSet<RegisteredListener>>) listeners).put(Event.Type.valueOf(name), null); setFieldAccessibility(pm, "listeners", false);}
@Overridepublic boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (command.getName().equals("test")) { TestEvent event = new TestEvent("TestEvent"); event.setSender(sender.toString()); this.getServer().getPluginManager().callEvent(event); } return false;}
Ser ut som this.getServer().getPluginManager().callEvent(event); er alt som skal til...
Player p = new Player()
Å implementere Player burde være helt unødvendig, det burde holde å definere en ny instans med innhold nok til å overbevise chat-relatert kode om at meldingen kom fra en spiller som bare tilfeldigvis ikke eksisterer noe sted. Kode: [Velg]Player p = new Player()
Men... strengt tatt burde det ikke engang være nødvendig å ha en spiller som avsender, jeg har mange plugins som genererer chat-meldinger anonymt og det er trivielt å få slike meldinger til å se ut som de kommer fra en spiller.
Man kan jo ikke instansiere en abstrakt klasse?
Tanken er SSH-brukere også skal kunne utføre kommandoer uten at det settes opp egne permissions for dem.
jo, jeg snublet nemlig over en plugin som er nødt til å gjøre dette: http://dev.bukkit.org/bukkit-plugins/sudo/
Player proxy = new MyPlayer(getServer().getPlayer("eksempel"));class MyPlayer implements Player { Player inner; MyPlayer(Player inner) { this.inner = inner; } // interessant funksjon @Override void sendMessage(String msg) { // skriv til SSH-strøm } // uinteressant funksjon @Override boolean hasPermission(String perm) { return this.inner.hasPermission(perm); } // uinteressant funksjon ganger 100; 500 stygge linjer}
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;Player proxy = (Player) Proxy.newProxyInstance(Player.class.getClassLoader(), new Class[] { Player.class }, new MyInvocationHandler(getServer().getPlayer("eksempel")));class MyInvocationHandler implements InvocationHandler { Player inner; MyInvocationHandler(Player inner) { this.inner = inner; } @Override Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("sendMessage")) { // skriv til SSH-strøm } else { return method.invoke(inner, args); } }}