Initial Commit

This commit is contained in:
Sindusk
2018-03-31 13:23:16 -04:00
commit 7f3733295f
150 changed files with 16109 additions and 0 deletions

View File

@@ -0,0 +1,382 @@
package mod.sin.wyvern;
import org.gotti.wurmunlimited.modloader.classhooks.HookManager;
import com.wurmonline.server.FailedException;
import com.wurmonline.server.Server;
import com.wurmonline.server.creatures.CreatureTemplate;
import com.wurmonline.server.creatures.CreatureTemplateCreator;
import com.wurmonline.server.creatures.CreatureTemplateFactory;
import com.wurmonline.server.creatures.CreatureTemplateIds;
import com.wurmonline.server.creatures.NoSuchCreatureTemplateException;
import com.wurmonline.server.items.Item;
import com.wurmonline.server.items.ItemFactory;
import com.wurmonline.server.items.ItemList;
import com.wurmonline.server.items.NoSuchTemplateException;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;
import mod.sin.items.AffinityOrb;
public class TreasureChests {
public static void doItemSpawn(Item inventory, int[] templateTypes, float startQl, float qlValRange, int maxNums) {
/*if (item.getOwnerId() != -10) {
return;
}*/
/*Item[] currentItems = item.getAllItems(true);
boolean[] hasTypes = new boolean[templateTypes.length];
block2 : for (Item it : currentItems) {
for (int x = 0; x < templateTypes.length; ++x) {
if (templateTypes[x] != it.getTemplateId()) continue;
hasTypes[x] = true;
continue block2;
}
}
for (int x = 0; x < hasTypes.length; ++x) {*/
for (int x = 0; x < templateTypes.length; ++x){
//if (hasTypes[x]) continue; // Disabled so it doesn't mess with my things
for (int nums = 0; nums < maxNums; ++nums) {
try{
byte rrarity;
int templateType = templateTypes[x];
/*if (onGround) {
ItemFactory.createItem(templateType, startQl + Server.rand.nextFloat() * qlValRange, item.getPosX() + 0.3f, item.getPosY() + 0.3f, 65.0f, item.isOnSurface(), (byte) 0, -10, "");
continue;
}*/
boolean isBoneCollar = templateType == 867;
rrarity = (byte) (Server.rand.nextInt(100) == 0 || isBoneCollar ? 1 : 0);
if (rrarity > 0) {
rrarity = (byte) (Server.rand.nextInt(100) == 0 && isBoneCollar ? 2 : 1);
}
if (rrarity > 1) {
rrarity = (byte) (Server.rand.nextInt(100) == 0 && isBoneCollar ? 3 : 2);
}
float newql = startQl + Server.rand.nextFloat() * qlValRange;
Item toInsert = ItemFactory.createItem(templateType, newql, rrarity, "");
if (templateType == ItemList.statueHota){
toInsert.setAuxData((byte)Server.rand.nextInt(10));
toInsert.setWeight(50000, true);
}
if (templateType == ItemList.eggLarge) {
toInsert.setData1(CreatureTemplateCreator.getRandomDragonOrDrakeId());
}
if (templateType == ItemList.drakeHide) {
int colorId = CreatureTemplateCreator.getRandomDrakeId();
toInsert.setData1(colorId);
CreatureTemplate cTemplate = CreatureTemplateFactory.getInstance().getTemplate(colorId);
String creatureName = cTemplate.getName().toLowerCase();
if (!toInsert.getName().contains(creatureName)){
toInsert.setName(creatureName.toLowerCase() + " " + toInsert.getTemplate().getName());
}
toInsert.setWeight(50+Server.rand.nextInt(100), true);
}
if (templateType == ItemList.dragonScale) {
int[] dragonIds = new int[]{CreatureTemplateIds.DRAGON_BLACK_CID, CreatureTemplateIds.DRAGON_BLUE_CID, CreatureTemplateIds.DRAGON_GREEN_CID,
CreatureTemplateIds.DRAGON_RED_CID, CreatureTemplateIds.DRAGON_WHITE_CID};
int colorId = dragonIds[Server.rand.nextInt(dragonIds.length)];
toInsert.setData1(colorId);
CreatureTemplate cTemplate = CreatureTemplateFactory.getInstance().getTemplate(colorId);
String creatureName = cTemplate.getName().toLowerCase();
if (!toInsert.getName().contains(creatureName)){
toInsert.setName(creatureName.toLowerCase() + " " + toInsert.getTemplate().getName());
}
toInsert.setWeight(100+Server.rand.nextInt(150), true);
} // if
if (templateType == ItemList.riftCrystal || templateType == ItemList.riftWood || templateType == ItemList.riftStone) {
toInsert.setHasNoDecay(true);
} // if
inventory.insertItem(toInsert, true);
continue;
} catch (NoSuchTemplateException | FailedException | NoSuchCreatureTemplateException e) {
e.printStackTrace();
}
}
}
}
public static void newFillTreasureChest(Item item, int auxdata) {
// AuxData = random value 0-99
// 0-59 = rare, 60-89 = supreme, 90-99 = fantastic
int[] normalGems = new int[]{ItemList.emerald, ItemList.ruby, ItemList.opal, ItemList.diamond, ItemList.sapphire};
int[] starGems = new int[]{375, 377, 379, 381, 383};
int[] lumps = new int[]{44, 45, 46, 47, 48, 49, 205, 220, 221, 223, 694, 698, 837};
int[] potions = new int[]{871, 874, 875, 876, 877, 878, 879, 881, 883};
/*int[] usefulItems = {ItemList.axeSmall, ItemList.shieldMedium, ItemList.hatchet, ItemList.knifeCarving,
ItemList.pickAxe, ItemList.swordLong, ItemList.saw, ItemList.shovel, ItemList.rake, ItemList.hammerMetal,
ItemList.hammerWood, ItemList.anvilSmall, ItemList.cheeseDrill, ItemList.swordShort, ItemList.swordTwoHander,
ItemList.shieldSmallWood, ItemList.shieldSmallMetal, ItemList.shieldMediumWood, ItemList.shieldLargeWood,
ItemList.shieldLargeMetal, ItemList.axeHuge, ItemList.axeMedium, ItemList.knifeButchering,
ItemList.fishingRodIronHook, ItemList.stoneChisel, ItemList.leatherGlove, ItemList.leatherJacket,
ItemList.leatherBoot, ItemList.leatherSleeve, ItemList.leatherCap, ItemList.leatherHose, ItemList.clothGlove,
ItemList.clothShirt, ItemList.clothSleeve, ItemList.clothJacket, ItemList.clothHose, ItemList.clothShoes,
ItemList.studdedLeatherSleeve, ItemList.studdedLeatherBoot, ItemList.studdedLeatherCap,
ItemList.studdedLeatherHose, ItemList.studdedLeatherGlove, ItemList.studdedLeatherJacket,
ItemList.spindle, ItemList.flintSteel, ItemList.fishingRodWoodenHook, ItemList.stoneOven, ItemList.forge,
ItemList.anvilLarge, ItemList.cartSmall, ItemList.needleIron, ItemList.loom, ItemList.sickle, ItemList.scythe,
ItemList.gloveSteel, ItemList.chainBoot, ItemList.chainHose, ItemList.chainJacket, ItemList.chainSleeve,
ItemList.chainGlove, ItemList.chainCoif, ItemList.plateBoot, ItemList.plateHose, ItemList.plateJacket,
ItemList.plateSleeve, ItemList.plateGauntlet, ItemList.helmetBasinet, ItemList.helmetGreat, ItemList.helmetOpen,
ItemList.maulLarge, ItemList.maulSmall, ItemList.maulMedium, ItemList.whetStone, ItemList.pelt, ItemList.ropeTool,
ItemList.guardTower, ItemList.file, ItemList.awl, ItemList.leatherKnife, ItemList.scissors, ItemList.clayShaper,
ItemList.spatula, ItemList.bowShort, ItemList.bowMedium, ItemList.bowLong, ItemList.dragonLeatherSleeve,
ItemList.dragonLeatherBoot, ItemList.dragonLeatherCap, ItemList.dragonLeatherHose, ItemList.dragonLeatherGlove,
ItemList.dragonLeatherJacket, ItemList.dragonScaleBoot, ItemList.dragonScaleHose, ItemList.dragonScaleJacket,
ItemList.dragonScaleSleeve, ItemList.dragonScaleGauntlet, ItemList.boatRowing, ItemList.boatSailing,
ItemList.trowel, ItemList.statuetteFo, ItemList.statuetteLibila, ItemList.statuetteMagranon,
ItemList.statuetteVynora, ItemList.cartLarge, ItemList.cog, ItemList.corbita, ItemList.knarr, ItemList.caravel,
ItemList.saddle, ItemList.horseShoe, ItemList.meditationRugOne, ItemList.meditationRugTwo,
ItemList.meditationRugThree, ItemList.meditationRugFour, ItemList.groomingBrush, ItemList.spearLong,
ItemList.halberd, ItemList.spearSteel, ItemList.clothHood, ItemList.wagon, ItemList.boneCollar,
ItemList.spinningWheel, ItemList.smelter, ItemList.halterRope};*/
// Generate Rare Chest
if (auxdata < 60) {
if(item.getTemplateId() == ItemList.treasureChest){
item.setRarity((byte)1);
}
// Generate source, addy / glimmer, gem
int[] templateTypes = new int[]{ItemList.sourceCrystal, ItemList.adamantineBar,
ItemList.glimmerSteelBar, normalGems[Server.rand.nextInt(5)]};
doItemSpawn(item, templateTypes, 70.0f, 30.0f, 1);
// Generate seryll
if (Server.rand.nextBoolean()) {
doItemSpawn(item, new int[]{ItemList.seryllBar}, 60.0f, 20.0f, 1);
} // if
/*// Generate meal
if (Server.rand.nextBoolean()) {
this.doItemSpawn(item, new int[]{ItemList.steak}, (float)auxdata, 60.0f-(float)auxdata, 1, false);
} // if*/
// Generate random lump
if (Server.rand.nextBoolean()) {
doItemSpawn(item, new int[]{lumps[Server.rand.nextInt(13)]}, 80.0f, 20.0f, 1);
} // if
// Generate yellow potion
if (Server.rand.nextInt(5) == 0) {
doItemSpawn(item, new int[]{ItemList.potionIllusion}, 10.0f, 90.0f, 1);
} // if
// Generate fireworks
if (Server.rand.nextInt(20) == 0) {
doItemSpawn(item, new int[]{ItemList.fireworks}, (float)auxdata, 60.0f-(float)auxdata, 1);
} // if
// Generate affinity orb
if (Server.rand.nextInt(200-auxdata) == 0){
doItemSpawn(item, new int[]{22767}, 80.0f, 10.0f, 1); // Affinity Orb
}
/*// Generate random tool
if (Server.rand.nextInt(4) == 0) {
// generate random tool thingy
this.doItemSpawn(item, templateTypes6, 25.0f, 50.0f, 1, false);
} // if*/
/*// Generate source
if (Server.rand.nextInt(4) == 0) {
int[] templateTypes7 = new int[]{ItemList.skinWater};
// put 0.1-0.2kg of source in the water skin
this.doItemSpawn(item, templateTypes7, 25.0f, 50.0f, 1, false);
} // if*/
// Generate random potion
if (Server.rand.nextInt(10) == 0) {
doItemSpawn(item, new int[]{potions[Server.rand.nextInt(potions.length)]}, 50.0f, 50.0f, 1);
} // if
// Generate rift items
switch (Server.rand.nextInt(3)) {
case 0:
doItemSpawn(item, new int[]{ItemList.riftStone}, 90.0f, 10.0f, 1);
break;
case 1:
doItemSpawn(item, new int[]{ItemList.riftCrystal}, 90.0f, 10.0f, 1);
break;
case 2:
doItemSpawn(item, new int[]{ItemList.riftWood}, 90.0f, 10.0f, 1);
break;
} // switch
// Generate Supreme Chest
} else if (auxdata < 90) {
if(item.getTemplateId() == ItemList.treasureChest){
item.setRarity((byte)2);
}
// Generate source, gem
int[] templateTypes = new int[]{ItemList.sourceCrystal, 374 + Server.rand.nextInt(10)};
// vessel the gem
doItemSpawn(item, templateTypes, 80.0f, 20.0f, 1);
// Spawn addy / glimmer
int[] templateTypes2 = new int[]{ItemList.adamantineBar, ItemList.glimmerSteelBar};
doItemSpawn(item, templateTypes2, 80.0f, 20.0f, 2 + Server.rand.nextInt(2));
// Generate seryll
int[] templateTypes3 = new int[]{ItemList.seryllBar};
doItemSpawn(item, templateTypes3, 80.0f, 20.0f, 1 + Server.rand.nextInt(3));
/*// Generate meal
if (Server.rand.nextBoolean()) {
this.doItemSpawn(item, new int[]{ItemList.steak}, (float)auxdata, 90.0f-(float)auxdata, 2, false);
} // if*/
// Generate fireworks
if (Server.rand.nextInt(10) == 0) {
doItemSpawn(item, new int[]{ItemList.fireworks}, (float)auxdata, 90.0f-(float)auxdata, 1);
} // if
// Generate affinity orb
if (Server.rand.nextInt(150-auxdata) == 0){
doItemSpawn(item, new int[]{22767}, 90.0f, 5.0f, 1); // Affinity Orb
}
/*// Generate source
if (Server.rand.nextBoolean()) {
int[] templateTypes6 = new int[]{ItemList.skinWater};
// put 0.2-0.3kg of source in the water skin
this.doItemSpawn(item, templateTypes6, 25.0f, 50.0f, 1, false);
} // if*/
// Generate dragon hide / scale
if (Server.rand.nextInt(10) == 0) {
doItemSpawn(item, new int[]{371 + (Server.rand.nextBoolean() ? 0 : 1)}, 80.0f, 20.0f, 1);
} // if
// Generate rift items
doItemSpawn(item, new int[]{ItemList.riftStone}, 90.0f, 10.0f, 1);
doItemSpawn(item, new int[]{ItemList.riftCrystal}, 90.0f, 10.0f, 1);
doItemSpawn(item, new int[]{ItemList.riftWood}, 90.0f, 10.0f, 1);
// Generate Fantastic Chest
} else {
if(item.getTemplateId() == ItemList.treasureChest){
item.setRarity((byte)3);
}
// Generate source, gem
int[] templateTypes = new int[]{ItemList.sourceCrystal, starGems[Server.rand.nextInt(starGems.length)]};
doItemSpawn(item, templateTypes, 90.0f, 10.0f, 1);
// Generate addy / glimmer
int[] templateTypes2 = new int[]{ItemList.adamantineBar, ItemList.glimmerSteelBar};
doItemSpawn(item, templateTypes2, 80.0f, 20.0f, 3 + Server.rand.nextInt(3));
// Generate seryll
int[] templateTypes3 = new int[]{ItemList.seryllBar};
doItemSpawn(item, templateTypes3, 80.0f, 20.0f, 2 + Server.rand.nextInt(3));
// Generate affinity orb
if(Server.rand.nextBoolean()){
doItemSpawn(item, new int[]{AffinityOrb.templateId}, 99.0f, 1.0f, 1); // Affinity Orb
}
/*// Generate source
if (Server.rand.nextInt(4) != 0) {
int[] templateTypes5 = new int[]{ItemList.skinWater};
// put 0.5-0.7kg of source in the water skin
this.doItemSpawn(item, templateTypes5, 25.0f, 50.0f, 1, false);
} // if*/
// Generate fireworks
if (Server.rand.nextInt(5) == 0) {
doItemSpawn(item, new int[]{ItemList.fireworks}, (float)auxdata, 100.0f-(float)auxdata, 1);
} // if
/*
// Generate inscriber
if (Server.rand.nextInt(4) == 0) {
int[] templateTypes7 = new int[]{ItemList.inscriber};
this.doItemSpawn(item, templateTypes7, 99.0f, 1.0f, 1, false);
} // if
*/
// Generate dragon hide / scale
if (Server.rand.nextInt(10) == 0) {
doItemSpawn(item, new int[]{371 + (Server.rand.nextBoolean() ? 0 : 1)}, 90.0f, 10.0f, 1);
} // if
// Generate spyglass
if (Server.rand.nextInt(100) == 0) {
doItemSpawn(item, new int[]{ItemList.spyglass}, 99.0f, 1.0f, 1);
} // if
// Generate BoK
if (Server.rand.nextInt(100) == 0) {
doItemSpawn(item, new int[]{ItemList.bagKeeping}, 99.0f, 1.0f, 1);
} // if
// Generate rift items
doItemSpawn(item, new int[]{ItemList.riftStone}, 90.0f, 10.0f, 1 + Server.rand.nextInt(3));
doItemSpawn(item, new int[]{ItemList.riftCrystal}, 90.0f, 10.0f, 1 + Server.rand.nextInt(3));
doItemSpawn(item, new int[]{ItemList.riftWood}, 90.0f, 10.0f, 1 + Server.rand.nextInt(3));
// Generate OP items
int rand = Server.rand.nextInt(500);
int[] fantasticLoot = {};
int amount = 1;
if(rand < 249){
fantasticLoot = new int[]{ItemList.drakeHide};
amount = 3;
// Three chunks of random color dragon scale.
} else if(rand < 349){
fantasticLoot = new int[]{ItemList.dragonScale};
amount = 3;
// Random hota statue.
} else if(rand < 414){
fantasticLoot = new int[]{ItemList.statueHota};
// Rare Bone & Helmet
} else if (rand < 464) {
fantasticLoot = new int[]{ItemList.boneCollar/*, Server.rand.nextBoolean() ? ItemList.helmetBasinet : ItemList.helmetGreat*/};
// 1/100 chance of supreme, 1/10,000 of fantastic
// Sorcery
} else if (rand < 490) {
fantasticLoot = new int[]{795 + Server.rand.nextInt(16)};
// Dragon Egg
} else {
fantasticLoot = new int[]{ItemList.eggLarge};
} // else
doItemSpawn(item, fantasticLoot, 99.0f, 1.0f, amount);
}
} // fillTreasureChest
public static void preInit() throws NotFoundException, CannotCompileException{
ClassPool classPool = HookManager.getInstance().getClassPool();
CtClass ctZone = classPool.get("com.wurmonline.server.zones.Zone");
CtMethod ctCreateTreasureChest = ctZone.getDeclaredMethod("createTreasureChest");
// Increase treasure chest AuxData by 2.
ctCreateTreasureChest.instrument(new ExprEditor(){
public void edit(MethodCall m) throws CannotCompileException {
if (m.getMethodName().equals("setAuxData")) {
m.replace("$_ = $proceed((byte)(com.wurmonline.server.Server.rand.nextInt(100)));");
return;
}
}
});
// New treasure chest fill.
CtClass ctItem = classPool.get("com.wurmonline.server.items.Item");
ctItem.getDeclaredMethod("fillTreasureChest").setBody("{"
+ " mod.sin.wyvern.TreasureChests.newFillTreasureChest(this, this.getAuxData());"
+ " logger.info(\"Spawned treasure chest level \"+this.getAuxData()+\" at \"+(this.getPosX()/4)+\", \"+(this.getPosY()/4));"
+ "}");
// Add an Affinity Orb to the chest.
/*ctItem.getDeclaredMethod("fillTreasureChest").insertAfter(""
+ "if(this.getAuxData() >= 8){"
+ " int[] templateTypes8 = new int[]{22767};"
+ " this.spawnItemSpawn(templateTypes8, 99.0f, 1.0f, 1, false);"
+ "}"
+ "logger.info(\"Spawned treasure chest level \"+this.getAuxData()+\" at \"+(this.getPosX()/4)+\", \"+(this.getPosY()/4));");*/
}
}