package com.arlania;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import com.arlania.engine.task.Task;
import com.arlania.engine.task.TaskManager;
import com.arlania.model.Position;
import com.arlania.model.Item;
import com.arlania.model.Locations.Location;
import com.arlania.model.definitions.ItemDefinition;
import com.arlania.util.Stopwatch;
import com.arlania.world.World;
import com.arlania.world.content.Guild.GuildRank;
import com.arlania.world.entity.impl.npc.NPC;
import com.arlania.world.entity.impl.player.Player;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class ItemHashHandler {
private static Path itemHashPath = Paths.get("./data/hashes/items.json");
private static File itemHashFile;
private static ArrayList<String> itemHashArrayList;
private static final int TIME = 30000; // 30 secs
private static Stopwatch timer = new Stopwatch().reset();
public ItemHashHandler() {
System.out.println("ITEM HANDLER BEING CREATED");
itemHashArrayList = new ArrayList<String>();
itemHashFile = itemHashPath.toFile();
if (!itemHashFile.getParentFile().exists()) {
try {
System.out.println("CREATING NEW FILE / FOLDER");
itemHashFile.getParentFile().mkdirs();
itemHashArrayList.add("start");
itemHashFile.getParentFile().setWritable(true);
try (FileWriter writer = new FileWriter(itemHashFile)) {
Gson builder = new GsonBuilder().setPrettyPrinting().create();
JsonObject object = new JsonObject();
object.add("hashes", builder.toJsonTree(itemHashArrayList));
writer.write(builder.toJson(object));
writer.close();
System.out.println("Initialized item hash file: " + itemHashFile.getPath());
} catch (Exception e) {
// An error happened while saving.
GameServer.getLogger().log(Level.WARNING, "An error has occured while creating quiver file!", e);
}
} catch (SecurityException e) {
System.out.println("Unable to create directory for player data!");
}
} else {
load();
}
}
private void load() {
try (FileReader fileReader = new FileReader(itemHashFile)) {
System.out.println("Now attempting to read file from Item Hash File");
System.out.println(itemHashFile.getAbsolutePath());
JsonParser fileParser = new JsonParser();
Gson builder = new GsonBuilder().create();
JsonObject reader = (JsonObject) fileParser.parse(fileReader);
if (reader.has("hashes")) {
String[] hashes = builder.fromJson(reader.get("hashes").getAsJsonArray(), String[].class);
for (String s : hashes) {
itemHashArrayList.add(s);
}
System.out.println("[ITEM HASHES]: " + itemHashArrayList.size() + " hashes loaded.");
}
fileReader.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void add(String hash) {
if (hash != null) {
itemHashArrayList.add(hash);
update();
} else {
System.out.println("tossing null hash");
}
}
public void monitor() {
if (timer.elapsed(TIME)) {
timer.reset();
{//rewrite - add ge check
//System.out.println("Monitoring for duped items..");
HashMap<Player, ArrayList<String>> itemMap = new HashMap<Player, ArrayList<String>>();
for (Player player : World.getPlayers()) {
if (player == null)
continue;
//System.out.println("Scanning " + player.getUsername());
ArrayList<String> scannedItems = new ArrayList<String>();
//add ge check
Item[] bankItems = player.getBank().getItems();
Item[] inventoryItems = player.getInventory().getItems();
ArrayList<Item> bankArray = new ArrayList<Item>(Arrays.asList(bankItems));
ArrayList<Item> inventoryArray = new ArrayList<Item>(Arrays.asList(inventoryItems));
int dupeCounter = 0;
// BANK CHECK
if (bankItems.length > 0) {
for (Item i : bankItems) {
scannedItems.add(i.getItemHash());
for (Item i2 : bankArray) {
if (i != null && i2 != null) {
if (i.getItemHash() != null && i2.getItemHash() != null) {
if (i.getItemHash().equalsIgnoreCase(i2.getItemHash())) {
dupeCounter++;
}
}
}
}
if (dupeCounter > 1) {
player.setPlayerLocked(true);
player.sendMessage(
"@red@YOU HAVE BEEN DETECTED DUPING IN YOUR BANK AND YOUR ACCOUNT IS LOCKED.");
} else {
dupeCounter = 0;
}
}
}
dupeCounter = 0;
if (inventoryItems.length > 0) {
// INVENTORY CHECK
for (Item i : inventoryItems) {
scannedItems.add(i.getItemHash());
for (Item i2 : inventoryArray) {
if (i != null && i2 != null) {
if (i.getItemHash() != null && i2.getItemHash() != null) {
if (i.getItemHash().equalsIgnoreCase(i2.getItemHash())) {
dupeCounter++;
}
}
}
}
if (dupeCounter > 1) {
player.setPlayerLocked(true);
player.sendMessage(
"@red@YOU HAVE BEEN DETECTED DUPING IN YOUR INVENTORY AND YOUR ACCOUNT IS LOCKED.");
} else {
dupeCounter = 0;
}
}
}
dupeCounter = 0;
if (inventoryItems.length > 0 && bankItems.length > 0) {
// BANK -> INVENTORY CHECK
for (Item i : bankArray) {
for (Item i2 : inventoryArray) {
if (i != null && i2 != null) {
if (i.getItemHash() != null && i2.getItemHash() != null) {
if (i.getItemHash().equalsIgnoreCase(i2.getItemHash())) {
dupeCounter++;
}
}
}
}
if (dupeCounter > 0) {
player.setPlayerLocked(true);
player.sendMessage(
"@red@YOU HAVE BEEN DETECTED DUPING IN YOUR INVENTORY AND YOUR ACCOUNT IS LOCKED.");
}
}
}
dupeCounter = 0;
if (scannedItems.size() > 0) {
itemMap.put(player, scannedItems);
}
if (inventoryItems.length == 0 && bankItems.length == 0)
continue;
// SCANNED HASH CHECK
for (Entry<Player, ArrayList<String>> e : itemMap.entrySet()) {
if (!e.getKey().equals(player)) {
// check items
for (String hashes : scannedItems) {
if (e.getValue().contains(hashes) && hashes != null) {
dupeCounter++;
}
}
}
if (dupeCounter > 0) {
player.getPacketSender().sendMessage(
"@red@YOU HAVE BEEN DETECTED DUPING WITH ANOTHER PLAYER AND YOUR ACCOUNT HAS BEEN LOCKED.");
e.getKey().getPacketSender().sendMessage(
"@red@YOU HAVE BEEN DETECTED DUPING WITH ANOTHER PLAYER AND YOUR ACCOUNT HAS BEEN LOCKED.");
}
}
}
}
}
}
private void update() {
itemHashFile.getParentFile().setWritable(true);
// Attempt to make the player save directory if it doesn't
// exist.
if (!itemHashFile.getParentFile().exists()) {
try {
itemHashFile.getParentFile().mkdirs();
} catch (SecurityException e) {
System.out.println("Unable to create directory for player data!");
}
}
try (FileReader fileReader = new FileReader(itemHashFile)) {
System.out.println("Now attempting to read file from item hash File2");
JsonElement fileParser = new Gson().fromJson(fileReader, JsonElement.class);
System.out.println("made parser");
Gson builder = new GsonBuilder().create();
System.out.println("made builder");
JsonObject reader = fileParser.getAsJsonObject();
System.out.println("made reader");
Iterator<Entry<String, JsonElement>> it = reader.entrySet().iterator();
while(it.hasNext()) {
Entry<String,JsonElement> e = it.next();
System.out.println("entry: " + e.getKey());
System.out.println("value: " + e.getValue());
}
if (reader.getAsJsonObject().has("hashes")) {
reader.getAsJsonObject().remove("hashes");
} else {
System.out.println("reader has no hashes");
}
System.out.println("{HASH ARRAY SIZE}: " + itemHashArrayList.size());
reader.getAsJsonObject().add("hashes", builder.toJsonTree(itemHashArrayList));
try (FileWriter writer = new FileWriter(itemHashFile)) {
Gson builder2 = new GsonBuilder().setPrettyPrinting().create();
writer.write(builder2.toJson(reader));
writer.close();
System.out.println("Updated item hashes: " + itemHashFile.getPath());
} catch (Exception e) {
// An error happened while saving.
GameServer.getLogger().log(Level.WARNING, "An error has occured while saving a character file!", e);
}
fileReader.close();
} catch (Exception e) {
System.out.print(e.getMessage());
}
}
public boolean check(String hash) {
if (!itemHashArrayList.contains(hash)) {
return true;
} else {
return false;
}
}
public void delete(String hash) {
Iterator<String> it = itemHashArrayList.iterator();
while(it.hasNext()) {
String h = it.next();
if(h.equalsIgnoreCase(hash)) {
itemHashArrayList.remove(h);
System.out.println("deleted a hash");
break;
}
}
update();
}
}Add a code snippet to your website: www.paste.org