v3.0.1: removed code for pre-v2.2.0 blacksmith quest

This commit is contained in:
Evan Debenham
2025-03-03 15:16:43 -05:00
parent b7b32bfb14
commit 6bf5c9643a
6 changed files with 25 additions and 262 deletions

View File

@@ -1330,13 +1330,6 @@ actors.mobs.npcs.blacksmith.cant_enter_old=That area is not accessible on this r
actors.mobs.npcs.blacksmith.def_verb=blocked actors.mobs.npcs.blacksmith.def_verb=blocked
actors.mobs.npcs.blacksmith.desc=This troll blacksmith looks like all trolls look: he is tall and lean, and his skin resembles stone in both color and texture. The troll blacksmith is tinkering with disproportionally small tools. actors.mobs.npcs.blacksmith.desc=This troll blacksmith looks like all trolls look: he is tall and lean, and his skin resembles stone in both color and texture. The troll blacksmith is tinkering with disproportionally small tools.
##old blacksmith quest dialogue from pre-v2.2.0
actors.mobs.npcs.blacksmith.gold_1=Hey human! Wanna be useful, eh? Take dis pickaxe and mine me some _dark gold ore, 15 pieces_ should be enough. What do you mean, how am I gonna pay? You greedy...\nOk, ok, I don't have money to pay, but I can do some smithin' for you. Consider yourself lucky, I'm the only blacksmith around.
actors.mobs.npcs.blacksmith.blood_1=Hey human! Wanna be useful, eh? Take dis pickaxe and _kill a bat_ wit' it, I need its blood on the head. What do you mean, how am I gonna pay? You greedy...\nOk, ok, I don't have money to pay, but I can do some smithin' for you. Consider yourself lucky, I'm the only blacksmith around.
actors.mobs.npcs.blacksmith.gold_2=Dark gold ore. 15 pieces. Seriously, is it dat hard?
actors.mobs.npcs.blacksmith.blood_2=I said I need bat blood on the pickaxe. Chop chop!
actors.mobs.npcs.blacksmith.completed=Oh, you have returned... Better late dan never.
actors.mobs.npcs.ghost.name=sad ghost actors.mobs.npcs.ghost.name=sad ghost
actors.mobs.npcs.ghost.rat_1=Hello %s... Once I was like you - strong and confident... But I was slain by a foul beast... I can't leave this place... Not until I have my revenge... Slay the _fetid rat,_ that has taken my life...\n\nIt stalks this floor... Spreading filth everywhere... _Beware its cloud of stink and corrosive bite, the acid dissolves in water..._ actors.mobs.npcs.ghost.rat_1=Hello %s... Once I was like you - strong and confident... But I was slain by a foul beast... I can't leave this place... Not until I have my revenge... Slay the _fetid rat,_ that has taken my life...\n\nIt stalks this floor... Spreading filth everywhere... _Beware its cloud of stink and corrosive bite, the acid dissolves in water..._
actors.mobs.npcs.ghost.rat_2=Please... Help me... Slay the abomination...\n\n_Fight it near water... Avoid the stench..._ actors.mobs.npcs.ghost.rat_2=Please... Help me... Slay the abomination...\n\n_Fight it near water... Avoid the stench..._

View File

@@ -885,8 +885,6 @@ items.quest.metalshard.name=cursed metal shard
items.quest.metalshard.desc=A shard of rusted cursed metal, which broke off DM-300 as it was destroyed. You can feel an inactive malevolent magic within it.\n\nIt does nothing on its own, but it might be useful when combined with certain scrolls, or a bomb. At the very least it should convert into a decent amount of energy. items.quest.metalshard.desc=A shard of rusted cursed metal, which broke off DM-300 as it was destroyed. You can feel an inactive malevolent magic within it.\n\nIt does nothing on its own, but it might be useful when combined with certain scrolls, or a bomb. At the very least it should convert into a decent amount of energy.
items.quest.pickaxe.name=pickaxe items.quest.pickaxe.name=pickaxe
items.quest.pickaxe.ac_mine=MINE
items.quest.pickaxe.no_vein=There is no dark gold vein near you to mine.
items.quest.pickaxe.ability_name=pierce items.quest.pickaxe.ability_name=pierce
items.quest.pickaxe.ability_desc=The Duelist can _pierce_ an enemy with a pickaxe. This is guaranteed to hit, applies vulnerable for 3 turns, and deals _%1$d-%2$d damage_ to enemies with rigid skin. items.quest.pickaxe.ability_desc=The Duelist can _pierce_ an enemy with a pickaxe. This is guaranteed to hit, applies vulnerable for 3 turns, and deals _%1$d-%2$d damage_ to enemies with rigid skin.
items.quest.pickaxe.upgrade_ability_stat_name=Ability Damage items.quest.pickaxe.upgrade_ability_stat_name=Ability Damage

View File

@@ -89,28 +89,21 @@ public class Blacksmith extends NPC {
String msg1 = ""; String msg1 = "";
String msg2 = ""; String msg2 = "";
if (Quest.type == Quest.OLD){ switch (Dungeon.hero.heroClass){
//pre-v2.2.0 saves case WARRIOR: msg1 += Messages.get(Blacksmith.this, "intro_quest_warrior"); break;
msg1 = Quest.alternative ? Messages.get(Blacksmith.this, "blood_1") : Messages.get(Blacksmith.this, "gold_1"); case MAGE: msg1 += Messages.get(Blacksmith.this, "intro_quest_mage"); break;
} else { case ROGUE: msg1 += Messages.get(Blacksmith.this, "intro_quest_rogue"); break;
case HUNTRESS: msg1 += Messages.get(Blacksmith.this, "intro_quest_huntress"); break;
case DUELIST: msg1 += Messages.get(Blacksmith.this, "intro_quest_duelist"); break;
case CLERIC: msg1 += Messages.get(Blacksmith.this, "intro_quest_cleric"); break;
}
switch (Dungeon.hero.heroClass){ msg1 += "\n\n" + Messages.get(Blacksmith.this, "intro_quest_start");
case WARRIOR: msg1 += Messages.get(Blacksmith.this, "intro_quest_warrior"); break;
case MAGE: msg1 += Messages.get(Blacksmith.this, "intro_quest_mage"); break;
case ROGUE: msg1 += Messages.get(Blacksmith.this, "intro_quest_rogue"); break;
case HUNTRESS: msg1 += Messages.get(Blacksmith.this, "intro_quest_huntress"); break;
case DUELIST: msg1 += Messages.get(Blacksmith.this, "intro_quest_duelist"); break;
case CLERIC: msg1 += Messages.get(Blacksmith.this, "intro_quest_cleric"); break;
}
msg1 += "\n\n" + Messages.get(Blacksmith.this, "intro_quest_start");
switch (Quest.type){
case Quest.CRYSTAL: msg2 += Messages.get(Blacksmith.this, "intro_quest_crystal"); break;
case Quest.GNOLL: msg2 += Messages.get(Blacksmith.this, "intro_quest_gnoll"); break;
case Quest.FUNGI: msg2 += Messages.get(Blacksmith.this, "intro_quest_fungi"); break;
}
switch (Quest.type){
case Quest.CRYSTAL: msg2 += Messages.get(Blacksmith.this, "intro_quest_crystal"); break;
case Quest.GNOLL: msg2 += Messages.get(Blacksmith.this, "intro_quest_gnoll"); break;
case Quest.FUNGI: msg2 += Messages.get(Blacksmith.this, "intro_quest_fungi"); break;
} }
final String msg1Final = msg1; final String msg1Final = msg1;
@@ -144,73 +137,13 @@ public class Blacksmith extends NPC {
} else if (!Quest.completed) { } else if (!Quest.completed) {
if (Quest.type == Quest.OLD) { String msg = Messages.get(this, "reminder") + "\n\n";
if (Quest.alternative) { switch (Quest.type){
case Quest.CRYSTAL: msg += Messages.get(Blacksmith.this, "reminder_crystal"); break;
Pickaxe pick = Dungeon.hero.belongings.getItem(Pickaxe.class); case Quest.GNOLL: msg += Messages.get(Blacksmith.this, "reminder_gnoll"); break;
if (pick == null) { case Quest.FUNGI: msg += Messages.get(Blacksmith.this, "reminder_fungi"); break;
tell(Messages.get(this, "lost_pick"));
} else if (!pick.bloodStained) {
tell(Messages.get(this, "blood_2"));
} else {
if (pick.isEquipped(Dungeon.hero)) {
boolean wasCursed = pick.cursed;
pick.cursed = false; //so that it can always be removed
pick.doUnequip(Dungeon.hero, false);
pick.cursed = wasCursed;
}
pick.detach(Dungeon.hero.belongings.backpack);
Quest.pickaxe = pick;
tell(Messages.get(this, "completed"));
Quest.completed = true;
Statistics.questScores[2] = 3000;
}
} else {
Pickaxe pick = Dungeon.hero.belongings.getItem(Pickaxe.class);
DarkGold gold = Dungeon.hero.belongings.getItem(DarkGold.class);
if (pick == null) {
tell(Messages.get(this, "lost_pick"));
} else if (gold == null || gold.quantity() < 15) {
tell(Messages.get(this, "gold_2"));
} else {
if (pick.isEquipped(Dungeon.hero)) {
boolean wasCursed = pick.cursed;
pick.cursed = false; //so that it can always be removed
pick.doUnequip(Dungeon.hero, false);
pick.cursed = wasCursed;
}
pick.detach(Dungeon.hero.belongings.backpack);
Quest.pickaxe = pick;
gold.detachAll(Dungeon.hero.belongings.backpack);
tell(Messages.get(this, "completed"));
Quest.completed = true;
Statistics.questScores[2] = 3000;
}
}
} else {
String msg = Messages.get(this, "reminder") + "\n\n";
switch (Quest.type){
case Quest.CRYSTAL: msg += Messages.get(Blacksmith.this, "reminder_crystal"); break;
case Quest.GNOLL: msg += Messages.get(Blacksmith.this, "reminder_gnoll"); break;
case Quest.FUNGI: msg += Messages.get(Blacksmith.this, "reminder_fungi"); break;
}
tell(msg);
} }
} else if (Quest.type == Quest.OLD && Quest.reforges == 0) { tell(msg);
Game.runOnRenderThread(new Callback() {
@Override
public void call() {
GameScene.show( new WndBlacksmith.WndReforge( Blacksmith.this, null ) );
}
});
} else if (Quest.rewardsAvailable()) { } else if (Quest.rewardsAvailable()) {
@@ -267,12 +200,9 @@ public class Blacksmith extends NPC {
public static class Quest { public static class Quest {
private static int type = 0; private static int type = 0;
public static final int OLD = 0;
public static final int CRYSTAL = 1; public static final int CRYSTAL = 1;
public static final int GNOLL = 2; public static final int GNOLL = 2;
public static final int FUNGI = 3; //The fungi quest is not implemented, only exists partially in code public static final int FUNGI = 3; //The fungi quest is not implemented, only exists partially in code
//pre-v2.2.0
private static boolean alternative; //false for mining gold, true for bat blood
//quest state information //quest state information
private static boolean spawned; private static boolean spawned;
@@ -284,7 +214,7 @@ public class Blacksmith extends NPC {
//reward tracking. Stores remaining favor, the pickaxe, and how many of each reward has been chosen //reward tracking. Stores remaining favor, the pickaxe, and how many of each reward has been chosen
public static int favor; public static int favor;
public static Item pickaxe; public static Item pickaxe;
public static int reforges; //also used by the pre-v2.2.0 version of the quest public static int reforges;
public static int hardens; public static int hardens;
public static int upgrades; public static int upgrades;
public static int smiths; public static int smiths;
@@ -296,7 +226,6 @@ public class Blacksmith extends NPC {
public static void reset() { public static void reset() {
type = 0; type = 0;
alternative = false;
spawned = false; spawned = false;
given = false; given = false;
@@ -345,7 +274,6 @@ public class Blacksmith extends NPC {
if (spawned) { if (spawned) {
node.put( TYPE, type ); node.put( TYPE, type );
node.put( ALTERNATIVE, alternative );
node.put( GIVEN, given ); node.put( GIVEN, given );
node.put( STARTED, started ); node.put( STARTED, started );
@@ -377,7 +305,6 @@ public class Blacksmith extends NPC {
if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) { if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) {
type = node.getInt(TYPE); type = node.getInt(TYPE);
alternative = node.getBoolean( ALTERNATIVE );
given = node.getBoolean( GIVEN ); given = node.getBoolean( GIVEN );
started = node.getBoolean( STARTED ); started = node.getBoolean( STARTED );
@@ -390,12 +317,7 @@ public class Blacksmith extends NPC {
} else { } else {
pickaxe = null; pickaxe = null;
} }
if (node.contains("reforged")){ reforges = node.getInt( REFORGES );
//pre-v2.2.0 saves
reforges = node.getBoolean( "reforged" ) ? 1 : 0;
} else {
reforges = node.getInt( REFORGES );
}
hardens = node.getInt( HARDENS ); hardens = node.getInt( HARDENS );
upgrades = node.getInt( UPGRADES ); upgrades = node.getInt( UPGRADES );
smiths = node.getInt( SMITHS ); smiths = node.getInt( SMITHS );
@@ -421,7 +343,6 @@ public class Blacksmith extends NPC {
//Currently cannot roll the fungi quest, as it is not fully implemented //Currently cannot roll the fungi quest, as it is not fully implemented
type = Random.IntRange(1, 2); type = Random.IntRange(1, 2);
alternative = false;
given = false; given = false;
generateRewards( true ); generateRewards( true );
@@ -540,17 +461,5 @@ public class Blacksmith extends NPC {
|| (pickaxe != null && Statistics.questScores[2] >= 2500); || (pickaxe != null && Statistics.questScores[2] >= 2500);
} }
//if the blacksmith is generated pre-v2.2.0, and the player never spawned a mining test floor
public static boolean oldQuestMineBlocked(){
return type == OLD && !Dungeon.levelHasBeenGenerated(Dungeon.depth, 1);
}
public static boolean oldBloodQuest(){
return type == OLD && alternative;
}
public static boolean oldMiningQuest(){
return type == OLD && !alternative;
}
} }
} }

View File

@@ -29,42 +29,24 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bat;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bee;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Scorpio; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Scorpio;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Spinner; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Spinner;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.MiningLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.MiningLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite.Glowing;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample; import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback; import com.watabou.utils.Callback;
import com.watabou.utils.PathFinder;
import java.util.ArrayList; import java.util.ArrayList;
//various code in here supports old blacksmith quest logic from before v2.2.0
public class Pickaxe extends MeleeWeapon { public class Pickaxe extends MeleeWeapon {
public static final String AC_MINE = "MINE";
public static final float TIME_TO_MINE = 2;
private static final Glowing BLOODY = new Glowing( 0x550000 );
{ {
image = ItemSpriteSheet.PICKAXE; image = ItemSpriteSheet.PICKAXE;
@@ -75,8 +57,6 @@ public class Pickaxe extends MeleeWeapon {
tier = 2; tier = 2;
} }
public boolean bloodStained = false;
@Override @Override
public int STRReq(int lvl) { public int STRReq(int lvl) {
@@ -86,108 +66,18 @@ public class Pickaxe extends MeleeWeapon {
@Override @Override
public ArrayList<String> actions( Hero hero ) { public ArrayList<String> actions( Hero hero ) {
ArrayList<String> actions = super.actions( hero ); ArrayList<String> actions = super.actions( hero );
if (Blacksmith.Quest.oldMiningQuest()) {
actions.add(AC_MINE);
}
if (Dungeon.level instanceof MiningLevel){ if (Dungeon.level instanceof MiningLevel){
actions.remove(AC_DROP); actions.remove(AC_DROP);
actions.remove(AC_THROW); actions.remove(AC_THROW);
} }
return actions; return actions;
} }
@Override
public void execute( final Hero hero, String action ) {
super.execute( hero, action );
if (action.equals(AC_MINE)) {
if (Dungeon.depth < 11 || Dungeon.depth > 15) {
GLog.w( Messages.get(this, "no_vein") );
return;
}
for (int i = 0; i < PathFinder.NEIGHBOURS8.length; i++) {
final int pos = hero.pos + PathFinder.NEIGHBOURS8[i];
if (Dungeon.level.map[pos] == Terrain.WALL_DECO) {
hero.spend( TIME_TO_MINE );
hero.busy();
hero.sprite.attack( pos, new Callback() {
@Override
public void call() {
CellEmitter.center( pos ).burst( Speck.factory( Speck.STAR ), 7 );
Sample.INSTANCE.play( Assets.Sounds.EVOKE );
Level.set( pos, Terrain.WALL );
GameScene.updateMap( pos );
DarkGold gold = new DarkGold();
if (gold.doPickUp( Dungeon.hero )) {
GLog.i( Messages.capitalize(Messages.get(Dungeon.hero, "you_now_have", gold.name())) );
} else {
Dungeon.level.drop( gold, hero.pos ).sprite.drop();
}
hero.onOperateComplete();
}
} );
return;
}
}
GLog.w( Messages.get(this, "no_vein") );
}
}
@Override
public int proc( Char attacker, Char defender, int damage ) {
if (Blacksmith.Quest.oldBloodQuest() && !bloodStained && defender instanceof Bat) {
Actor.add(new Actor() {
{
actPriority = VFX_PRIO;
}
@Override
protected boolean act() {
if (!defender.isAlive()){
bloodStained = true;
updateQuickslot();
}
Actor.remove(this);
return true;
}
});
}
return super.proc( attacker, defender, damage );
}
@Override @Override
public boolean keptThroughLostInventory() { public boolean keptThroughLostInventory() {
//pickaxe is always kept when it's needed for the mining level //pickaxe is always kept when it's needed for the mining level
return super.keptThroughLostInventory() || Dungeon.level instanceof MiningLevel; return super.keptThroughLostInventory() || Dungeon.level instanceof MiningLevel;
} }
@Override
public String defaultAction() {
if (Dungeon.hero.heroClass == HeroClass.DUELIST && isEquipped(Dungeon.hero)){
return AC_ABILITY;
} else if (Blacksmith.Quest.oldMiningQuest()) {
return AC_MINE;
} else {
return super.defaultAction();
}
}
@Override @Override
public String targetingPrompt() { public String targetingPrompt() {
return Messages.get(this, "prompt"); return Messages.get(this, "prompt");
@@ -254,29 +144,4 @@ public class Pickaxe extends MeleeWeapon {
return augment.damageFactor(min(level)+dmgBoost) + "-" + augment.damageFactor(max(level)+dmgBoost); return augment.damageFactor(min(level)+dmgBoost) + "-" + augment.damageFactor(max(level)+dmgBoost);
} }
private static final String BLOODSTAINED = "bloodStained";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( BLOODSTAINED, bloodStained );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
bloodStained = bundle.getBoolean( BLOODSTAINED );
}
@Override
public Glowing glowing() {
if (super.glowing() == null) {
return bloodStained ? BLOODY : null;
} else {
return super.glowing();
}
}
} }

View File

@@ -116,7 +116,7 @@ public class CavesLevel extends RegularLevel {
@Override @Override
public boolean activateTransition(Hero hero, LevelTransition transition) { public boolean activateTransition(Hero hero, LevelTransition transition) {
if (transition.type == LevelTransition.Type.BRANCH_EXIT if (transition.type == LevelTransition.Type.BRANCH_EXIT
&& (!Blacksmith.Quest.given() || Blacksmith.Quest.oldQuestMineBlocked() || Blacksmith.Quest.completed() || !Blacksmith.Quest.started())) { && (!Blacksmith.Quest.given() || Blacksmith.Quest.completed() || !Blacksmith.Quest.started())) {
Blacksmith smith = null; Blacksmith smith = null;
for (Char c : Actor.chars()){ for (Char c : Actor.chars()){
@@ -126,11 +126,9 @@ public class CavesLevel extends RegularLevel {
} }
} }
if (Blacksmith.Quest.oldQuestMineBlocked()){ if (smith == null || !Blacksmith.Quest.given() || Blacksmith.Quest.completed()) {
GLog.w(Messages.get(Blacksmith.class, "cant_enter_old"));
} else if (smith == null || !Blacksmith.Quest.given() || Blacksmith.Quest.completed()) {
GLog.w(Messages.get(Blacksmith.class, "entrance_blocked")); GLog.w(Messages.get(Blacksmith.class, "entrance_blocked"));
} else if (!Blacksmith.Quest.started() && Blacksmith.Quest.Type() != Blacksmith.Quest.OLD){ } else {
final Pickaxe pick = hero.belongings.getItem(Pickaxe.class); final Pickaxe pick = hero.belongings.getItem(Pickaxe.class);
Game.runOnRenderThread(new Callback() { Game.runOnRenderThread(new Callback() {
@Override @Override

View File

@@ -238,7 +238,7 @@ public class MiningLevel extends CavesLevel {
@Override @Override
public boolean activateTransition(Hero hero, LevelTransition transition) { public boolean activateTransition(Hero hero, LevelTransition transition) {
if (transition.type == LevelTransition.Type.BRANCH_ENTRANCE if (transition.type == LevelTransition.Type.BRANCH_ENTRANCE
&& !Blacksmith.Quest.completed() && Blacksmith.Quest.Type() != Blacksmith.Quest.OLD) { && !Blacksmith.Quest.completed()) {
if (hero.belongings.getItem(Pickaxe.class) == null){ if (hero.belongings.getItem(Pickaxe.class) == null){
Game.runOnRenderThread(new Callback() { Game.runOnRenderThread(new Callback() {