Originally Posted by
Mysticcccccc
You should specify the minimum and maximum amount of an item a npc can drop.
Or else you will have npc's like the tzhaar dropping x amount of tokkul every kill.
Other than that, this isn't bad.
Thanks for sharing.
maximum effort lol.
Code:
package org.os_exile.entity.impl.npc;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import org.os_exile.model.item.Item;
import org.os_exile.util.Util;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class NPCJsonDrops {
private static final NPCJsonDrops[] instance = new NPCJsonDrops[NPCDefinitions.MAX_NPC_AMOUNT];
public static final NPCJsonDrops get(final int id) {
return instance[id];
}
public static final void writeDropDef() {
final NPCJsonDrops generalGraardor = new NPCJsonDrops(2215,
Optional.of(new NPCDropDefs(RarityTable.ALWAYS, new NPCDropItem[] { new NPCDropItem(532, 1) })),
Optional.of(new NPCDropDefs(RarityTable.COMMON,
new NPCDropItem[] { new NPCDropItem(1319, 1), new NPCDropItem(1275, 1),
new NPCDropItem(1303, 1), new NPCDropItem(1127, 1), new NPCDropItem(450, 15, 5),
new NPCDropItem(454, 115, 5), new NPCDropItem(995, 19581, 509) })),
Optional.of(new NPCDropDefs(RarityTable.UNCOMMON,
new NPCDropItem[] { new NPCDropItem(561, 60, 10), new NPCDropItem(5300, 1),
new NPCDropItem(1514, 15, 5), new NPCDropItem(3024, 3), new NPCDropItem(3001, 3) })),
Optional.of(new NPCDropDefs(RarityTable.RARE,
new NPCDropItem[] { new NPCDropItem(1289, 1), new NPCDropItem(11832, 1),
new NPCDropItem(11834, 1), new NPCDropItem(11836, 1), new NPCDropItem(11818, 1),
new NPCDropItem(11820, 1), new NPCDropItem(11822, 1), new NPCDropItem(12073, 1),
new NPCDropItem(10976, 1), new NPCDropItem(11812, 1) })),
Optional.of(new NPCDropDefs(RarityTable.VERY_RARE,
new NPCDropItem[] { new NPCDropItem(10977, 1), new NPCDropItem(12650, 1) })));
try {
final BufferedWriter writer = new BufferedWriter(
new FileWriter("./Data/json/drops/" + generalGraardor.id + ".json", true));
final GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
final Gson gson = builder.create();
gson.toJson(generalGraardor, writer);
writer.close();
} catch (IOException e) {
}
}
public static RarityTable getRarityTable(final double roll) {
RarityTable table = RarityTable.COMMON;
if (roll <= 30) {
table = RarityTable.UNCOMMON;
}
if (roll <= 5) {
table = RarityTable.RARE;
}
if (roll <= .01) {
table = RarityTable.VERY_RARE;
}
return table;
}
public static final void LoadNPCJsonDrops() {
//writeDropDef();
for (int index = 0; index < NPCDefinitions.MAX_NPC_AMOUNT; index++) {
final File file = new File("./Data/json/drops/" + index + ".json");
if (!file.exists()) {
continue;
}
try {
final NPCJsonDrops in = new Gson().fromJson(new FileReader(file), NPCJsonDrops.class);
instance[index] = in;
} catch (IOException e) {
}
}
System.out.println(instance.length + " npc drops has been loaded...");
}
public NPCJsonDrops(final int id, final Optional<NPCDropDefs> alwaysDrops, Optional<NPCDropDefs> commonDrops,
Optional<NPCDropDefs> uncommonDrops, Optional<NPCDropDefs> rareDrops, Optional<NPCDropDefs> veryRareDrops) {
this.id = id;
this.alwaysDrops = alwaysDrops;
this.commonDrops = commonDrops;
this.uncommonDrops = uncommonDrops;
this.rareDrops = rareDrops;
this.veryRareDrops = veryRareDrops;
}
private int id;
private Optional<NPCDropDefs> alwaysDrops = Optional.empty();
private Optional<NPCDropDefs> commonDrops = Optional.empty();
private Optional<NPCDropDefs> uncommonDrops = Optional.empty();
private Optional<NPCDropDefs> rareDrops = Optional.empty();
private Optional<NPCDropDefs> veryRareDrops = Optional.empty();
public int getId() {
return this.id;
}
public Optional<NPCDropDefs> getAlwaysDrops() {
return alwaysDrops;
}
public Optional<NPCDropDefs> getCommonDrops() {
return commonDrops;
}
public Optional<NPCDropDefs> getUncommonDrops() {
return this.uncommonDrops;
}
public Optional<NPCDropDefs> getRareDrops() {
return this.rareDrops;
}
public Optional<NPCDropDefs> getVeryRareDrops() {
return this.veryRareDrops;
}
public static class NPCDropDefs {
public NPCDropDefs(final RarityTable rarityTable, final NPCDropItem[] items) {
this.rarityTable = rarityTable;
this.items = items;
}
private final RarityTable rarityTable;
private final NPCDropItem[] items;
public RarityTable getRarityTable() {
return this.rarityTable;
}
public NPCDropItem[] getItems() {
return this.items;
}
}
public static class NPCDropItem {
public NPCDropItem(final int id, final int minimumCount) {
this.id = id;
this.minimumCount = minimumCount;
this.randomCount = 0;
}
public NPCDropItem(final int id, final int minimumCount, final int randomCount) {
this.id = id;
this.minimumCount = minimumCount;
this.randomCount = randomCount;
}
private final int id;
private final int minimumCount;
private final int randomCount;
public int getId() {
return this.id;
}
public int getMinimumCount() {
return this.minimumCount + Util.random(randomCount);
}
}
public enum RarityTable {
ALWAYS, COMMON, UNCOMMON, RARE, VERY_RARE
}
}
Code:
public List<Item> getLoot() {
final List<Item> drops = new ArrayList<>();
final NPCJsonDrops npcDrops = NPCJsonDrops.get(npcType);
if (npcDrops == null) {
return null;
}
final List<NPCDropItem> alwaysDrops = Arrays.asList(npcDrops.getAlwaysDrops().get().getItems());
alwaysDrops.forEach((alwaysDrop) -> {
if (alwaysDrop.getId() > 0)
drops.add(new Item(alwaysDrop.getId(), alwaysDrop.getMinimumCount()));
});
final double roll = (new Random().nextDouble() * 100);
final RarityTable rarityTable = NPCJsonDrops.getRarityTable(roll);
NPCDropDefs drop = null;
if (rarityTable == RarityTable.COMMON && npcDrops.getCommonDrops().isPresent()) {
drop = npcDrops.getCommonDrops().get();
} else if (rarityTable == RarityTable.UNCOMMON && npcDrops.getUncommonDrops().isPresent()) {
drop = npcDrops.getUncommonDrops().get();
} else if (rarityTable == RarityTable.RARE && npcDrops.getRareDrops().isPresent()) {
drop = npcDrops.getRareDrops().get();
} else if (rarityTable == RarityTable.VERY_RARE && npcDrops.getVeryRareDrops().isPresent()) {
drop = npcDrops.getVeryRareDrops().get();
}
final int index = new Random().nextInt(drop.getItems().length);
final int id = drop.getItems()[index].getId();
final int count = drop.getItems()[index].getMinimumCount();
if (id > 0) {
drops.add(new Item(id, count));
}
return drops;
}
Code:
{
"id": 2215,
"alwaysDrops": {
"value": {
"rarityTable": "ALWAYS",
"items": [
{
"id": 532,
"minimumCount": 1,
"randomCount": 0
}
]
}
},
"commonDrops": {
"value": {
"rarityTable": "COMMON",
"items": [
{
"id": 1319,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 1275,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 1303,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 1127,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 450,
"minimumCount": 15,
"randomCount": 5
},
{
"id": 454,
"minimumCount": 115,
"randomCount": 5
},
{
"id": 995,
"minimumCount": 19581,
"randomCount": 509
}
]
}
},
"uncommonDrops": {
"value": {
"rarityTable": "UNCOMMON",
"items": [
{
"id": 561,
"minimumCount": 60,
"randomCount": 10
},
{
"id": 5300,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 1514,
"minimumCount": 15,
"randomCount": 5
},
{
"id": 3024,
"minimumCount": 3,
"randomCount": 0
},
{
"id": 3001,
"minimumCount": 3,
"randomCount": 0
}
]
}
},
"rareDrops": {
"value": {
"rarityTable": "RARE",
"items": [
{
"id": 1289,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11832,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11834,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11836,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11818,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11820,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11822,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 12073,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 10976,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 11812,
"minimumCount": 1,
"randomCount": 0
}
]
}
},
"veryRareDrops": {
"value": {
"rarityTable": "VERY_RARE",
"items": [
{
"id": 10977,
"minimumCount": 1,
"randomCount": 0
},
{
"id": 12650,
"minimumCount": 1,
"randomCount": 0
}
]
}
}
}