Updated to 1.8
parent
510222c0e4
commit
80f94301b8
2
README
2
README
|
@ -1,4 +1,4 @@
|
|||
Copyright (C) 2011-2012 lishid. All rights reserved.
|
||||
Copyright (C) 2011-2015 lishid. All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.lishid</groupId>
|
||||
<artifactId>orebfuscator</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>3.0.0</version>
|
||||
<name>Orebfuscator</name>
|
||||
<url>http://dev.bukkit.org/server-mods/orebfuscator/</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>comphenix-snapshots</id>
|
||||
<url>http://repo.comphenix.net/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>repobo-snap</id>
|
||||
<url>http://repo.bukkit.org/content/groups/public</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>bukkit-plugins</id>
|
||||
<url>http://repo.bukkit.org/content/groups/public</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>craftbukkit</artifactId>
|
||||
<version>1.8-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.comphenix.protocol</groupId>
|
||||
<artifactId>ProtocolLib</artifactId>
|
||||
<version>3.5.0-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<defaultGoal>clean install</defaultGoal>
|
||||
<sourceDirectory>src/main/java</sourceDirectory>
|
||||
<testSourceDirectory>src/test/java</testSourceDirectory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
<excludes>
|
||||
<exclude>**/*.java</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<scm>
|
||||
<connection>scm:git:git://github.com/lishid/Orebfuscator.git</connection>
|
||||
<developerConnection>scm:git:git@github.com:lishid/Orebfuscator.git</developerConnection>
|
||||
<url>https://github.com/lishid/Orebfuscator</url>
|
||||
</scm>
|
||||
</project>
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
|
||||
public interface IChunkCache {
|
||||
public void clearCache();
|
||||
|
||||
public DataInputStream getInputStream(File folder, int x, int z);
|
||||
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z);
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
public interface IChunkQueue {
|
||||
public void FinishedProcessing(IPacket56 packet);
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
public interface IMinecraftWorldServer {
|
||||
public void Notify(Object server, int x, int y, int z);
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
public interface INBT {
|
||||
public void reset();
|
||||
|
||||
public void setInt(String tag, int value);
|
||||
|
||||
public void setLong(String tag, long value);
|
||||
|
||||
public void setBoolean(String tag, boolean value);
|
||||
|
||||
public void setByteArray(String tag, byte[] value);
|
||||
|
||||
public void setIntArray(String tag, int[] value);
|
||||
|
||||
public int getInt(String tag);
|
||||
|
||||
public long getLong(String tag);
|
||||
|
||||
public boolean getBoolean(String tag);
|
||||
|
||||
public byte[] getByteArray(String tag);
|
||||
|
||||
public int[] getIntArray(String tag);
|
||||
|
||||
public void Read(DataInput stream);
|
||||
|
||||
public void Write(DataOutput stream);
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
public interface IPacket56 {
|
||||
public void setPacket(Object packet);
|
||||
|
||||
public int getPacketChunkNumber();
|
||||
|
||||
public int[] getX();
|
||||
|
||||
public int[] getZ();
|
||||
|
||||
public int[] getChunkMask();
|
||||
|
||||
public int[] getExtraMask();
|
||||
|
||||
public Object getFieldData(String field);
|
||||
|
||||
public void setFieldData(String field, Object data);
|
||||
|
||||
public String getInflatedBuffers();
|
||||
|
||||
public String getBuildBuffer();
|
||||
|
||||
public String getOutputBuffer();
|
||||
|
||||
public void compress(Deflater deflater);
|
||||
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface IPlayerHook {
|
||||
public void HookNM(Player p);
|
||||
|
||||
public void HookChunkQueue(Player p);
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal;
|
||||
|
||||
import org.bukkit.Server;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
|
||||
public class InternalAccessor {
|
||||
public static InternalAccessor Instance;
|
||||
private String version;
|
||||
|
||||
/*
|
||||
* Returns false if version not supported
|
||||
*/
|
||||
public static boolean Initialize(Server server) {
|
||||
Instance = new InternalAccessor();
|
||||
String packageName = server.getClass().getPackage().getName();
|
||||
Instance.version = packageName.substring(packageName.lastIndexOf('.') + 1);
|
||||
|
||||
try {
|
||||
Class.forName("com.lishid.orebfuscator.internal." + Instance.version + ".PlayerHook");
|
||||
return true;
|
||||
}
|
||||
catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void PrintError() {
|
||||
Orebfuscator.log("Orebfuscator encountered an error with the CraftBukkit version \"" + Instance.version + "\". Please look for an updated version of Orebfuscator.");
|
||||
}
|
||||
|
||||
public INBT newNBT() {
|
||||
return (INBT) createObject(INBT.class, "NBT");
|
||||
}
|
||||
|
||||
public IChunkCache newChunkCache() {
|
||||
return (IChunkCache) createObject(IChunkCache.class, "ChunkCache");
|
||||
}
|
||||
|
||||
public IPacket51 newPacket51() {
|
||||
return (IPacket51) createObject(IPacket51.class, "Packet51");
|
||||
}
|
||||
|
||||
public IPacket56 newPacket56() {
|
||||
return (IPacket56) createObject(IPacket56.class, "Packet56");
|
||||
}
|
||||
|
||||
public IPlayerHook newPlayerHook() {
|
||||
return (IPlayerHook) createObject(IPlayerHook.class, "PlayerHook");
|
||||
}
|
||||
|
||||
public IBlockAccess newBlockAccess() {
|
||||
return (IBlockAccess) createObject(IBlockAccess.class, "BlockAccess");
|
||||
}
|
||||
|
||||
public IMinecraftWorldServer newMinecraftWorldServer() {
|
||||
return (IMinecraftWorldServer) createObject(IMinecraftWorldServer.class, "MinecraftWorldServer");
|
||||
}
|
||||
|
||||
private Object createObject(Class<? extends Object> assignableClass, String className) {
|
||||
try {
|
||||
Class<?> internalClass = Class.forName("com.lishid.orebfuscator.internal." + version + "." + className);
|
||||
if (assignableClass.isAssignableFrom(internalClass)) {
|
||||
return internalClass.getConstructor().newInstance();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
PrintError();
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
import org.bukkit.craftbukkit.entity.*;
|
||||
import org.bukkit.craftbukkit.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.i(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().netServerHandler.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,303 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
import org.bukkit.craftbukkit.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result = internalQueue.add(e);
|
||||
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().netServerHandler.disconnected) {
|
||||
// Cleanup all queues
|
||||
internalQueue.clear();
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().netServerHandler.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
player.getHandle().p().getTracker().a(player.getHandle(), player.getHandle().p().getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().netServerHandler.networkManager;
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
try {
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "y")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().netServerHandler.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
import org.bukkit.craftbukkit.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.k() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(NetHandler handler) {
|
||||
if (this.e == 1 && handler instanceof NetServerHandler) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((NetServerHandler) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.craftbukkit;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.*;
|
||||
|
||||
import org.bukkit.craftbukkit.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().netServerHandler.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
import org.bukkit.craftbukkit.v1_4_5.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_4_5.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.i(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().netServerHandler.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,303 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
import org.bukkit.craftbukkit.v1_4_5.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result = internalQueue.add(e);
|
||||
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().netServerHandler.disconnected) {
|
||||
// Cleanup all queues
|
||||
internalQueue.clear();
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().netServerHandler.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
player.getHandle().p().getTracker().a(player.getHandle(), player.getHandle().p().getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().netServerHandler.networkManager;
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
try {
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "y")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().netServerHandler.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
import org.bukkit.craftbukkit.v1_4_5.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.k() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(NetHandler handler) {
|
||||
if (this.e == 1 && handler instanceof NetServerHandler) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((NetServerHandler) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_5;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_5.*;
|
||||
|
||||
import org.bukkit.craftbukkit.v1_4_5.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().netServerHandler.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,304 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
import org.bukkit.craftbukkit.v1_4_6.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result = internalQueue.add(e);
|
||||
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
internalQueue.clear();
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
player.getHandle().p().getTracker().a(player.getHandle(), player.getHandle().p().getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "y")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
import org.bukkit.craftbukkit.v1_4_6.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.k() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_6;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_6.*;
|
||||
|
||||
import org.bukkit.craftbukkit.v1_4_6.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_4_R1.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_4_R1.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.i(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,318 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_4_R1.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result;
|
||||
synchronized (internalQueue) {
|
||||
result = internalQueue.add(e);
|
||||
}
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
synchronized (internalQueue) {
|
||||
internalQueue.clear();
|
||||
}
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
player.getHandle().p().getTracker().a(player.getHandle(), player.getHandle().p().getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
if (!Orebfuscator.usePL) {
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "y")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
synchronized (internalQueue) {
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_4_R1.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.k() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_4_R1;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_4_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_4_R1.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R2.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R2.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.l(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,318 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R2.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result;
|
||||
synchronized (internalQueue) {
|
||||
result = internalQueue.add(e);
|
||||
}
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
synchronized (internalQueue) {
|
||||
internalQueue.clear();
|
||||
}
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
((WorldServer) player.getHandle().world).getTracker().a(player.getHandle(), player.getHandle().world.getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
if (!Orebfuscator.useSpigot) {
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "z")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
synchronized (internalQueue) {
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R2.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.n() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R2;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R2.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R3.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R3.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.l(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,318 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R3.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result;
|
||||
synchronized (internalQueue) {
|
||||
result = internalQueue.add(e);
|
||||
}
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
synchronized (internalQueue) {
|
||||
internalQueue.clear();
|
||||
}
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
((WorldServer) player.getHandle().world).getTracker().a(player.getHandle(), player.getHandle().world.getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
if (!Orebfuscator.useSpigot) {
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "z")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
synchronized (internalQueue) {
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R3.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.n() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_5_R3;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_5_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_5_R3.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R1.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R1.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.l(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,318 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R1.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result;
|
||||
synchronized (internalQueue) {
|
||||
result = internalQueue.add(e);
|
||||
}
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
synchronized (internalQueue) {
|
||||
internalQueue.clear();
|
||||
}
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
((WorldServer) player.getHandle().world).getTracker().a(player.getHandle(), player.getHandle().world.getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
if (!Orebfuscator.useSpigot) {
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "z")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
synchronized (internalQueue) {
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R1.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.n() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R1;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R1.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R2.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R2.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.l(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,318 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R2.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result;
|
||||
synchronized (internalQueue) {
|
||||
result = internalQueue.add(e);
|
||||
}
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
synchronized (internalQueue) {
|
||||
internalQueue.clear();
|
||||
}
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
((WorldServer) player.getHandle().world).getTracker().a(player.getHandle(), player.getHandle().world.getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
if (!Orebfuscator.useSpigot) {
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "z")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
synchronized (internalQueue) {
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R2.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.n() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R2;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R2.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R2.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R3.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R3.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.l(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,318 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R3.entity.*;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
Packet56MapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
boolean result;
|
||||
synchronized (internalQueue) {
|
||||
result = internalQueue.add(e);
|
||||
}
|
||||
// Move everything into the internal queue
|
||||
return result;
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.disconnected) {
|
||||
// Cleanup all queues
|
||||
synchronized (internalQueue) {
|
||||
internalQueue.clear();
|
||||
}
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
synchronized (internalQueue) {
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity((TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
((WorldServer) player.getHandle().world).getTracker().a(player.getHandle(), player.getHandle().world.getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Network queue limit is 2097152 bytes
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
|
||||
// We'll allow the size of 3 packets to be queued = 75000 bytes
|
||||
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
if (!Orebfuscator.useSpigot) {
|
||||
try {
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
if (((int) (Integer) ReflectionHelper.getPrivateField(NetworkManager.class, networkManager, "z")) > 75000) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
// Queue up to 5 chunks
|
||||
synchronized (internalQueue) {
|
||||
while (!internalQueue.isEmpty() && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.remove(0);
|
||||
|
||||
// If the chunk is loaded and not null
|
||||
if (chunkcoordintpair != null && player.getHandle().world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(player.getHandle().world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new Packet56MapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R3.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
||||
import com.lishid.orebfuscator.internal.INBT;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
|
||||
public class NBT implements INBT {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
nbt = new NBTTagCompound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInt(String tag, int value) {
|
||||
nbt.setInt(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLong(String tag, long value) {
|
||||
nbt.setLong(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoolean(String tag, boolean value) {
|
||||
nbt.setBoolean(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setByteArray(String tag, byte[] value) {
|
||||
nbt.setByteArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIntArray(String tag, int[] value) {
|
||||
nbt.setIntArray(tag, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInt(String tag) {
|
||||
return nbt.getInt(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLong(String tag) {
|
||||
return nbt.getLong(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getBoolean(String tag) {
|
||||
return nbt.getBoolean(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getByteArray(String tag) {
|
||||
return nbt.getByteArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getIntArray(String tag) {
|
||||
return nbt.getIntArray(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Read(DataInput stream) {
|
||||
nbt = NBTCompressedStreamTools.a(stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void Write(DataOutput stream) {
|
||||
NBTCompressedStreamTools.a(nbt, stream);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
|
||||
public class NetworkQueue extends ArrayList<Packet> {
|
||||
private static final long serialVersionUID = 4252847662044263527L;
|
||||
private Player player;
|
||||
|
||||
public NetworkQueue(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Packet packet) {
|
||||
if (packet.n() == 51) {
|
||||
IPacket51 packet51 = InternalAccessor.Instance.newPacket51();
|
||||
packet51.setPacket(packet);
|
||||
Calculations.Obfuscate(packet51, this.player);
|
||||
}
|
||||
|
||||
return super.add(packet);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import com.lishid.orebfuscator.hithack.BlockHitManager;
|
||||
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
|
||||
public class Packet14Orebfuscator extends Packet14BlockDig {
|
||||
@Override
|
||||
public void handle(Connection handler) {
|
||||
if (this.e == 1 && handler instanceof PlayerConnection) {
|
||||
boolean canHit = BlockHitManager.hitBlock(((PlayerConnection) handler).getPlayer(), null);
|
||||
if (!canHit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.handle(handler);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IPacket51;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
|
||||
public class Packet51 implements IPacket51 {
|
||||
private static Class<? extends Object> packetClass = Packet51MapChunk.class;
|
||||
|
||||
Packet51MapChunk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet51MapChunk) {
|
||||
this.packet = (Packet51MapChunk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getX() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZ() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChunkMask() {
|
||||
return packet.c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExtraMask() {
|
||||
return packet.d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "inflatedBuffer");
|
||||
}
|
||||
|
||||
private byte[] getOutputBuffer() {
|
||||
return (byte[]) ReflectionHelper.getPrivateField(packetClass, packet, "buffer");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
byte[] chunkInflatedBuffer = getBuffer();
|
||||
byte[] chunkBuffer = getOutputBuffer();
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(chunkInflatedBuffer, 0, chunkInflatedBuffer.length);
|
||||
deflater.finish();
|
||||
ReflectionHelper.setPrivateField(packetClass, packet, "size", deflater.deflate(chunkBuffer));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.util.zip.Deflater;
|
||||
|
||||
import com.lishid.orebfuscator.commands.OrebfuscatorCommandExecutor;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
|
||||
public class Packet56 implements IPacket56 {
|
||||
Packet56MapChunkBulk packet;
|
||||
|
||||
@Override
|
||||
public void setPacket(Object packet) {
|
||||
if (packet instanceof Packet56MapChunkBulk) {
|
||||
this.packet = (Packet56MapChunkBulk) packet;
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPacketChunkNumber() {
|
||||
return packet.d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getX() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "c");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getZ() {
|
||||
return (int[]) ReflectionHelper.getPrivateField(packet, "d");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getChunkMask() {
|
||||
return packet.a;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getExtraMask() {
|
||||
return packet.b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getFieldData(String field) {
|
||||
return ReflectionHelper.getPrivateField(Packet56MapChunkBulk.class, packet, field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFieldData(String field, Object data) {
|
||||
ReflectionHelper.setPrivateField(Packet56MapChunkBulk.class, packet, field, data);
|
||||
}
|
||||
|
||||
public String getInflatedBuffers() {
|
||||
return "inflatedBuffers";
|
||||
}
|
||||
|
||||
public String getBuildBuffer() {
|
||||
return "buildBuffer";
|
||||
}
|
||||
|
||||
public String getOutputBuffer() {
|
||||
return "buffer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void compress(Deflater deflater) {
|
||||
if (getFieldData(getOutputBuffer()) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] buildBuffer = (byte[]) getFieldData(getBuildBuffer());
|
||||
|
||||
deflater.reset();
|
||||
deflater.setInput(buildBuffer);
|
||||
deflater.finish();
|
||||
|
||||
byte[] buffer = new byte[buildBuffer.length + 100];
|
||||
|
||||
ReflectionHelper.setPrivateField(packet, "buffer", buffer);
|
||||
int size = deflater.deflate(buffer);
|
||||
ReflectionHelper.setPrivateField(packet, "size", size);
|
||||
|
||||
// Free memory
|
||||
ReflectionHelper.setPrivateField(packet, "buildBuffer", null);
|
||||
ReflectionHelper.setPrivateField(packet, "inflatedBuffers", null);
|
||||
|
||||
if (OrebfuscatorCommandExecutor.DebugMode) {
|
||||
System.out.println("Packet size: " + size);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_6_R3;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.internal.IPlayerHook;
|
||||
import com.lishid.orebfuscator.utils.ReflectionHelper;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_6_R3.*;
|
||||
import org.bukkit.craftbukkit.v1_6_R3.entity.*;
|
||||
|
||||
public class PlayerHook implements IPlayerHook {
|
||||
@SuppressWarnings("unchecked")
|
||||
public void HookNM(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
// Update NetworkManager's lists
|
||||
NetworkManager networkManager = (NetworkManager) player.getHandle().playerConnection.networkManager;
|
||||
|
||||
Field[] networkFields = networkManager.getClass().getDeclaredFields();
|
||||
for (Field field : networkFields) {
|
||||
try {
|
||||
if (List.class.isAssignableFrom(field.getType())) {
|
||||
List<Packet> list = new NetworkQueue(p);
|
||||
field.setAccessible(true);
|
||||
List<Packet> oldList = (List<Packet>) field.get(networkManager);
|
||||
// Move packets to new list
|
||||
synchronized (ReflectionHelper.getPrivateField(networkManager, "h")) {
|
||||
list.addAll(oldList);
|
||||
oldList.clear();
|
||||
}
|
||||
// Replace with new list
|
||||
field.set(networkManager, Collections.synchronizedList(list));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
hookPacket();
|
||||
}
|
||||
|
||||
static boolean hookPacket = false;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void hookPacket() {
|
||||
if (hookPacket)
|
||||
return;
|
||||
|
||||
hookPacket = true;
|
||||
Packet.l.a(14, Packet14Orebfuscator.class);
|
||||
// Use reflection to add into a and c
|
||||
Field[] packetFields = Packet.class.getDeclaredFields();
|
||||
for (Field field : packetFields) {
|
||||
try {
|
||||
if (Map.class.isAssignableFrom(field.getType())) {
|
||||
field.setAccessible(true);
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
Map packets = (Map) field.get(null);
|
||||
packets.put(Packet14Orebfuscator.class, 14);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HookChunkQueue(Player p) {
|
||||
CraftPlayer player = (CraftPlayer) p;
|
||||
ReflectionHelper.setPrivateFinal(player.getHandle(), "chunkCoordIntPairQueue", new ChunkQueue(player, player.getHandle().chunkCoordIntPairQueue));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_7_R1;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IBlockAccess;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_7_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_7_R1.entity.*;
|
||||
import org.bukkit.craftbukkit.v1_7_R1.*;
|
||||
|
||||
public class BlockAccess implements IBlockAccess {
|
||||
@Override
|
||||
public boolean isBlockTransparent(int id) {
|
||||
return !Block.e(id).r();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateBlockTileEntity(org.bukkit.block.Block block, Player player) {
|
||||
CraftWorld world = (CraftWorld) block.getWorld();
|
||||
TileEntity tileEntity = world.getTileEntityAt(block.getX(), block.getY(), block.getZ());
|
||||
if (tileEntity == null) {
|
||||
return;
|
||||
}
|
||||
Packet packet = tileEntity.getUpdatePacket();
|
||||
if (packet != null) {
|
||||
CraftPlayer player2 = (CraftPlayer) player;
|
||||
player2.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_7_R1;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.internal.IChunkCache;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_7_R1.*;
|
||||
|
||||
public class ChunkCache implements IChunkCache {
|
||||
private static final HashMap<File, RegionFile> cachedRegionFiles = new HashMap<File, RegionFile>();
|
||||
|
||||
private synchronized RegionFile getRegionFile(File folder, int x, int z) {
|
||||
File path = new File(folder, "region");
|
||||
File file = new File(path, "r." + (x >> 5) + "." + (z >> 5) + ".mcr");
|
||||
try {
|
||||
RegionFile regionFile = cachedRegionFiles.get(file);
|
||||
if (regionFile != null) {
|
||||
return regionFile;
|
||||
}
|
||||
|
||||
if (!path.exists()) {
|
||||
path.mkdirs();
|
||||
}
|
||||
|
||||
if (cachedRegionFiles.size() >= OrebfuscatorConfig.MaxLoadedCacheFiles) {
|
||||
clearCache();
|
||||
}
|
||||
|
||||
regionFile = new RegionFile(file);
|
||||
cachedRegionFiles.put(file, regionFile);
|
||||
|
||||
return regionFile;
|
||||
}
|
||||
catch (Exception e) {
|
||||
try {
|
||||
file.delete();
|
||||
}
|
||||
catch (Exception e2) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataInputStream getInputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.a(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataOutputStream getOutputStream(File folder, int x, int z) {
|
||||
RegionFile regionFile = getRegionFile(folder, x, z);
|
||||
return regionFile.b(x & 0x1F, z & 0x1F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void clearCache() {
|
||||
for (RegionFile regionFile : cachedRegionFiles.values()) {
|
||||
try {
|
||||
if (regionFile != null)
|
||||
regionFile.c();
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
cachedRegionFiles.clear();
|
||||
}
|
||||
}
|
|
@ -1,368 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_7_R1;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import net.minecraft.server.v1_7_R1.Chunk;
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_7_R1.ChunkCoordIntPair;
|
||||
import net.minecraft.server.v1_7_R1.EntityPlayer;
|
||||
import net.minecraft.server.v1_7_R1.Packet;
|
||||
import net.minecraft.server.v1_7_R1.PacketPlayOutMapChunkBulk;
|
||||
import net.minecraft.server.v1_7_R1.TileEntity;
|
||||
import net.minecraft.server.v1_7_R1.TileEntitySign;
|
||||
import net.minecraft.server.v1_7_R1.World;
|
||||
import net.minecraft.server.v1_7_R1.WorldServer;
|
||||
import net.minecraft.util.io.netty.channel.Channel;
|
||||
|
||||
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
|
||||
|
||||
import com.lishid.orebfuscator.Orebfuscator;
|
||||
import com.lishid.orebfuscator.OrebfuscatorConfig;
|
||||
import com.lishid.orebfuscator.hook.ChunkProcessingThread;
|
||||
import com.lishid.orebfuscator.internal.IChunkQueue;
|
||||
import com.lishid.orebfuscator.internal.IPacket56;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
import com.lishid.orebfuscator.obfuscation.Calculations;
|
||||
import com.lishid.orebfuscator.obfuscation.MinecraftBlock;
|
||||
import com.lishid.orebfuscator.obfuscation.ProximityHider;
|
||||
|
||||
public class ChunkQueue extends LinkedList<ChunkCoordIntPair> implements IChunkQueue {
|
||||
private static final long serialVersionUID = -1928681564741152336L;
|
||||
List<ChunkCoordIntPair> internalQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> outputQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
List<ChunkCoordIntPair> processingQueue = Collections.synchronizedList(new LinkedList<ChunkCoordIntPair>());
|
||||
PacketPlayOutMapChunkBulk lastPacket;
|
||||
|
||||
CraftPlayer player;
|
||||
|
||||
Thread thread;
|
||||
AtomicBoolean kill = new AtomicBoolean(false);
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public ChunkQueue(CraftPlayer player, List previousEntries) {
|
||||
this.player = player;
|
||||
internalQueue.addAll(previousEntries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object arg0) {
|
||||
return internalQueue.remove(arg0) || processingQueue.remove(arg0) || outputQueue.remove(arg0);
|
||||
}
|
||||
|
||||
// Called when the queue should be cleared
|
||||
@Override
|
||||
public void clear() {
|
||||
// Clear the internal queue
|
||||
internalQueue.clear();
|
||||
super.clear();
|
||||
}
|
||||
|
||||
// Called when new chunks are queued
|
||||
@Override
|
||||
public boolean add(ChunkCoordIntPair e) {
|
||||
// Move everything into the internal queue
|
||||
return internalQueue.add(e);
|
||||
|
||||
// return super.add(e);
|
||||
}
|
||||
|
||||
// Called when the list should be sorted
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
sort();
|
||||
// Return the old array to be sorted
|
||||
return internalQueue.toArray();
|
||||
}
|
||||
|
||||
// This checks for chunks in the queue
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
// Checks whether the coords are actually in
|
||||
return internalQueue.contains(o) || processingQueue.contains(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
try {
|
||||
// If the player is gone, then don't waste time
|
||||
if (player.getHandle().playerConnection.isDisconnected()) {
|
||||
// Cleanup all queues
|
||||
internalQueue.clear();
|
||||
processingQueue.clear();
|
||||
outputQueue.clear();
|
||||
lastPacket = null;
|
||||
}
|
||||
else {
|
||||
// Process outputs and inputs
|
||||
processOutput();
|
||||
processInput();
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
// Sort the internal array according to CB - See PlayerChunkMap.movePlayer(EntityPlayer entityplayer)
|
||||
java.util.Collections.sort(internalQueue, new ChunkCoordComparator(player.getHandle()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void FinishedProcessing(IPacket56 packet) {
|
||||
if (lastPacket != null) {
|
||||
player.getHandle().playerConnection.sendPacket(lastPacket);
|
||||
// Remove reference to the packet so it can be freed when possible
|
||||
lastPacket = null;
|
||||
}
|
||||
outputQueue.addAll(processingQueue);
|
||||
processingQueue.clear();
|
||||
}
|
||||
|
||||
private void processOutput() {
|
||||
// Chunk packet finished processing, output relevant packets
|
||||
while (!outputQueue.isEmpty()) {
|
||||
// Get the chunk coordinate
|
||||
ChunkCoordIntPair chunk = outputQueue.remove(0);
|
||||
|
||||
// Check if the chunk is ready
|
||||
if (chunk != null && ((WorldServer) player.getHandle().world).isLoaded(chunk.x << 4, 0, chunk.z << 4)) {
|
||||
// Get all the TileEntities in the chunk
|
||||
@SuppressWarnings("rawtypes")
|
||||
List tileEntities = ((WorldServer) player.getHandle().world).getTileEntities(chunk.x * 16, 0, chunk.z * 16, chunk.x * 16 + 16, 256, chunk.z * 16 + 16);
|
||||
|
||||
Set<MinecraftBlock> signs = Calculations.getSignsList(player, chunk.x, chunk.z);
|
||||
for (Object o : tileEntities) {
|
||||
// Send out packet for the tile entity data
|
||||
this.updateTileEntity(signs, (TileEntity) o);
|
||||
}
|
||||
|
||||
// Start tracking entities in the chunk
|
||||
((WorldServer) player.getHandle().world).getTracker().a(player.getHandle(), player.getHandle().world.getChunkAt(chunk.x, chunk.z));
|
||||
}
|
||||
|
||||
// Force an update on ProximityHider
|
||||
if (OrebfuscatorConfig.UseProximityHider) {
|
||||
synchronized (ProximityHider.playersToCheck) {
|
||||
if (!ProximityHider.playersToCheck.containsKey(player))
|
||||
ProximityHider.playersToCheck.put(player, player.getLocation().add(1, 1, 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processInput() {
|
||||
// Queue next chunk packet out
|
||||
if (processingQueue.isEmpty() && !internalQueue.isEmpty()) {
|
||||
// Check if player's output queue has a lot of stuff waiting to be sent. If so, don't process and wait.
|
||||
|
||||
// Each chunk packet with 5 chunks is about 10000 - 25000 bytes
|
||||
// Try-catch so as to not disrupt chunk sending if something fails
|
||||
try {
|
||||
Channel channel = new PlayerHook().getChannel(player);
|
||||
if (!channel.isWritable()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Orebfuscator.log(e);
|
||||
}
|
||||
|
||||
// A list to queue chunks
|
||||
List<Chunk> chunks = new LinkedList<Chunk>();
|
||||
|
||||
World world = player.getHandle().world;
|
||||
WorldServer worldServer = (WorldServer) world;
|
||||
int i = 0;
|
||||
// Queue up to 5 chunks
|
||||
while (internalQueue.size() > i && chunks.size() < 5) {
|
||||
// Dequeue a chunk from input
|
||||
ChunkCoordIntPair chunkcoordintpair = internalQueue.get(i);
|
||||
|
||||
// Check not null
|
||||
if (chunkcoordintpair == null) {
|
||||
internalQueue.remove(i);
|
||||
continue;
|
||||
}
|
||||
// Check if the chunk is loaded
|
||||
if (world.chunkProvider.isChunkLoaded(chunkcoordintpair.x, chunkcoordintpair.z)) {
|
||||
Chunk chunk = world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z);
|
||||
// Check if chunk is ready
|
||||
if (chunk.k()) {
|
||||
// Load nearby chunks
|
||||
boolean waitLoad = false;
|
||||
if (!checkAndLoadChunk(worldServer, chunkcoordintpair.x - 1, chunkcoordintpair.z)) {
|
||||
waitLoad = true;
|
||||
}
|
||||
if (!checkAndLoadChunk(worldServer, chunkcoordintpair.x + 1, chunkcoordintpair.z)) {
|
||||
waitLoad = true;
|
||||
}
|
||||
if (!checkAndLoadChunk(worldServer, chunkcoordintpair.x, chunkcoordintpair.z - 1)) {
|
||||
waitLoad = true;
|
||||
}
|
||||
if (!checkAndLoadChunk(worldServer, chunkcoordintpair.x, chunkcoordintpair.z + 1)) {
|
||||
waitLoad = true;
|
||||
}
|
||||
if (!waitLoad) {
|
||||
// Queue the chunk for processing
|
||||
processingQueue.add(chunkcoordintpair);
|
||||
// Add the chunk to the list to create a packet
|
||||
chunks.add(chunk);
|
||||
internalQueue.remove(i);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
// If there are chunks to process
|
||||
if (!chunks.isEmpty()) {
|
||||
// Create a packet wrapper
|
||||
IPacket56 packet = InternalAccessor.Instance.newPacket56();
|
||||
// Create the actual packet
|
||||
lastPacket = new PacketPlayOutMapChunkBulk(chunks);
|
||||
// Put into wrapper
|
||||
packet.setPacket(lastPacket);
|
||||
// Send to Processing Thread
|
||||
ChunkProcessingThread.Queue(packet, player, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateTileEntity(Set<MinecraftBlock> signs, TileEntity tileentity) {
|
||||
if (tileentity != null) {
|
||||
if (tileentity instanceof TileEntitySign) {
|
||||
if (signs != null && signs.contains(new MinecraftBlock(tileentity.x, tileentity.y, tileentity.z))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
Packet packet = tileentity.getUpdatePacket();
|
||||
|
||||
if (packet != null) {
|
||||
player.getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkAndLoadChunk(WorldServer worldServer, int x, int z) {
|
||||
if (!worldServer.chunkProvider.isChunkLoaded(x, z)) {
|
||||
worldServer.chunkProviderServer.getChunkAt(x, z);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ChunkCoordIntPair> listIterator() {
|
||||
return new FakeIterator();
|
||||
}
|
||||
|
||||
private class FakeIterator implements ListIterator<ChunkCoordIntPair> {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair next() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChunkCoordIntPair previous() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {}
|
||||
|
||||
@Override
|
||||
public void set(ChunkCoordIntPair e) {}
|
||||
|
||||
@Override
|
||||
public void add(ChunkCoordIntPair e) {}
|
||||
}
|
||||
|
||||
private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> {
|
||||
private int x;
|
||||
private int z;
|
||||
|
||||
public ChunkCoordComparator(EntityPlayer entityplayer) {
|
||||
x = (int) entityplayer.locX >> 4;
|
||||
z = (int) entityplayer.locZ >> 4;
|
||||
}
|
||||
|
||||
public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) {
|
||||
if (a.equals(b)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Subtract current position to set center point
|
||||
int ax = a.x - this.x;
|
||||
int az = a.z - this.z;
|
||||
int bx = b.x - this.x;
|
||||
int bz = b.z - this.z;
|
||||
|
||||
int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (ax < 0) {
|
||||
if (bx < 0) {
|
||||
return bz - az;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (bx < 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return az - bz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2014 lishid. All rights reserved.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.lishid.orebfuscator.internal.v1_7_R1;
|
||||
|
||||
import com.lishid.orebfuscator.internal.IMinecraftWorldServer;
|
||||
import com.lishid.orebfuscator.internal.InternalAccessor;
|
||||
|
||||
//Volatile
|
||||
import net.minecraft.server.v1_7_R1.*;
|
||||
import org.bukkit.craftbukkit.v1_7_R1.*;
|
||||
|
||||
public class MinecraftWorldServer implements IMinecraftWorldServer {
|
||||
public void Notify(Object world, int x, int y, int z) {
|
||||
if (world instanceof CraftWorld) {
|
||||
WorldServer server = (WorldServer) ((CraftWorld) world).getHandle();
|
||||
server.notify(x, y, z);
|
||||
}
|
||||
else {
|
||||
InternalAccessor.Instance.PrintError();
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue