From 1a9d549a2e17fcf6ea56d732d43d39350327293e Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Sun, 10 Apr 2011 20:35:20 +0000 Subject: [PATCH 01/14] updated version number --- README.txt | 4 ++-- build.ant.properties | 2 +- runserver.bat | 2 +- runserver.sh | 2 +- src/games/stendhal/client/update/Version.java | 2 +- src/games/stendhal/common/Debug.java | 2 +- src/games/stendhal/server/core/engine/GenerateINI.java | 2 +- stendhal.jnlp | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.txt b/README.txt index 475afbeb02..db88423c78 100644 --- a/README.txt +++ b/README.txt @@ -39,12 +39,12 @@ Java is included in most Linux distributions. Both Sun Java and OpenJDK are supp Please download Stendhal from http://arianne.sourceforge.net Then unzip the client zip into a new folder. -You can double click on stendhal-0.92.5.jar and the client will run. +You can double click on stendhal-0.93.jar and the client will run. If you prefer to run from command line, then just execute this command in the stendhal folder: - java -jar stendhal-0.92.5.jar + java -jar stendhal-0.93.jar Alternatively you can run it using Java Webstart technology at: diff --git a/build.ant.properties b/build.ant.properties index dd584f9d23..f6cbfbe92d 100644 --- a/build.ant.properties +++ b/build.ant.properties @@ -73,7 +73,7 @@ version_server = http://arianne.sourceforge.net/stendhal.version # current version of stendhal version.old = 0.92 -version = 0.92.5 +version = 0.93 # javac options javac.deprecation = true diff --git a/runserver.bat b/runserver.bat index dfef766871..34d41ef4fb 100644 --- a/runserver.bat +++ b/runserver.bat @@ -1,3 +1,3 @@ -set STENDHAL_VERSION=0.92.5 +set STENDHAL_VERSION=0.93 set LOCALCLASSPATH=.;data\script;data\conf;stendhal-server-%STENDHAL_VERSION%.jar;marauroa.jar;mysql-connector.jar;log4j.jar;commons-lang.jar;h2.jar java -Xmx400m -cp "%LOCALCLASSPATH%" marauroa.server.marauroad -c server.ini -l diff --git a/runserver.sh b/runserver.sh index 7d6e8b1ec4..aa0bc841af 100644 --- a/runserver.sh +++ b/runserver.sh @@ -1,5 +1,5 @@ #!/bin/sh -STENDHAL_VERSION="0.92.5" +STENDHAL_VERSION="0.93" LOCALCLASSPATH=.:data/script/:data/conf/:stendhal-server-$STENDHAL_VERSION.jar:marauroa.jar:mysql-connector.jar:log4j.jar:commons-lang.jar:h2.jar diff --git a/src/games/stendhal/client/update/Version.java b/src/games/stendhal/client/update/Version.java index d77ee3f410..30a296fcdd 100644 --- a/src/games/stendhal/client/update/Version.java +++ b/src/games/stendhal/client/update/Version.java @@ -10,7 +10,7 @@ package games.stendhal.client.update; public class Version { /** Version Number. */ - private static final String VERSION = "0.92.5"; + private static final String VERSION = "0.93"; /** * Extract the specified number of parts from a version-string. diff --git a/src/games/stendhal/common/Debug.java b/src/games/stendhal/common/Debug.java index a47d85dc65..5ce9739e3f 100644 --- a/src/games/stendhal/common/Debug.java +++ b/src/games/stendhal/common/Debug.java @@ -26,7 +26,7 @@ public class Debug { /** version. */ // Note: This line is updated by build.xml using a regexp so be sure to adjust it in case you modify this line. - public static final String VERSION = "0.92.5"; + public static final String VERSION = "0.93"; public static final String PRE_RELEASE_VERSION = null; diff --git a/src/games/stendhal/server/core/engine/GenerateINI.java b/src/games/stendhal/server/core/engine/GenerateINI.java index b5b075fb1d..afeba66635 100644 --- a/src/games/stendhal/server/core/engine/GenerateINI.java +++ b/src/games/stendhal/server/core/engine/GenerateINI.java @@ -271,7 +271,7 @@ public class GenerateINI { out.println(); out.println("server_typeGame=" + gameName); out.println("server_name=" + gameName + " Marauroa server"); - out.println("server_version=0.92.5"); + out.println("server_version=0.93"); out.println("server_contact=https://sourceforge.net/tracker/?atid=514826&group_id=66537&func=browse"); out.println(); out.println("# Extensions configured on the server. Enable at will."); diff --git a/stendhal.jnlp b/stendhal.jnlp index 94f78f3e1e..d3ffa607b0 100644 --- a/stendhal.jnlp +++ b/stendhal.jnlp @@ -22,7 +22,7 @@ Some of these people are NPC, they will give you tasks to accomplish and hints t - + From 9af47f1d460f3612c4b892af89a1852c5febd8b8 Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Tue, 12 Apr 2011 17:43:02 +0000 Subject: [PATCH 02/14] backported fixed misspelling at Imorgen #3284738 reported by monsterdhal, and some other minor spellings/grammar in text and description (by kymara) --- .../stendhal/server/maps/fado/forest/WitchNPC.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/games/stendhal/server/maps/fado/forest/WitchNPC.java b/src/games/stendhal/server/maps/fado/forest/WitchNPC.java index cb91177297..477416437b 100644 --- a/src/games/stendhal/server/maps/fado/forest/WitchNPC.java +++ b/src/games/stendhal/server/maps/fado/forest/WitchNPC.java @@ -53,12 +53,12 @@ public class WitchNPC implements ZoneConfigurator { @Override protected void createDialog() { addGreeting("Hello wanderer!"); - addJob("I'm a witch and pratice each day to become a powerful one soon."); - addQuest("My grandma inside is quite concerned... She is ill and afraid and I need to help her and will figure out, #how..."); - addReply("how", "The question really is what may help here... Maybe I'll ask her later about it, I first have to finish my new #receipe..."); - addReply("receipe", "Oh I doubt that you can eat or drink what I prepare at the moment... But I know two really nice women who can make some tasty #soup for you."); + addJob("I'm a witch and practice each day, I hope to become a powerful one soon."); + addQuest("My grandma inside is quite concerned... She is ill and afraid and I need to help her. I just need to figure out #how..."); + addReply("how", "The question really is what may help... Maybe I'll ask her later about it, I first have to finish my new #recipe..."); + addReply("recipe", "Oh I doubt that you can eat or drink what I prepare at the moment... But I know two really nice women who can make some tasty #soup for you."); addReply("soup", "Florence Boullabaisse and Mother Helena are awesome soup cooks. You'll find them on the Ados market and in the Fado tavern."); - addHelp("Aldrin sells some honey, you will love to eat it with bread."); + addHelp("Aldrin sells some honey, you would love to eat it with bread."); addOffer("I'm sorry but I can't sell you anything."); addGoodbye("Bye bye and take care around here!"); } @@ -67,7 +67,7 @@ public class WitchNPC implements ZoneConfigurator { npc.setEntityClass("youngwitchnpc"); npc.setPosition(59, 29); npc.initHP(100); - npc.setDescription("You see Imorgin. She is a young witch whose mystical aura can be felt over a long distance."); + npc.setDescription("You see Imorgen. She is a young witch whose mystical aura can be felt over a long distance."); zone.add(npc); } } From e1fa52b942cf269ebaad8024748101b4936a8af7 Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Tue, 12 Apr 2011 17:43:20 +0000 Subject: [PATCH 03/14] backported fixed Spelling/grammar for Mircea - 3284740 (by kymara) --- .../server/maps/fado/forest/OldWitchNPC.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/games/stendhal/server/maps/fado/forest/OldWitchNPC.java b/src/games/stendhal/server/maps/fado/forest/OldWitchNPC.java index 2f4caad885..3417ec8c69 100644 --- a/src/games/stendhal/server/maps/fado/forest/OldWitchNPC.java +++ b/src/games/stendhal/server/maps/fado/forest/OldWitchNPC.java @@ -48,20 +48,20 @@ public class OldWitchNPC implements ZoneConfigurator { @Override protected void createDialog() { addGreeting("Hello *Cough*"); - addJob("I had been a powerful witch before I risked too much and lost my powers while fighting against some #werwolfes."); - addReply("werwolfes", "They are really dangerous! I met some on the way to Kikareukin earlier and have been deeply poisoned. That is why I have to rest here."); - addQuest("Oh dear, you seem to be really nice and trustful but I can't give you any work at the moment."); - addHelp("My daughter #Imorgen outside can maybe help you. She knows lots of people around Faiumoni."); - addReply("Imorgen", "She will hopefully become a powerful witch like me in the future. But she still has to learn a lot."); + addJob("I was once a powerful witch. But I took a great risk and lost my powers, fighting against some #werewolves."); + addReply("werewolves", "They are really dangerous! I met some on the way to Kikareukin earlier and have been deeply poisoned. That is why I have to rest here."); + addQuest("Oh dear, you seem to be really nice and trustful, but I can't give you any work at the moment."); + addHelp("Maybe my daughter #Imorgen outside can help you. She knows lots of people around Faiumoni."); + addReply("Imorgen", "Hopefully she'll become a powerful witch like me in the future. But she still has to learn a lot."); addOffer("I would like to sell you one of my famous drinks but I can't *cough*."); - addGoodbye("I hope we'll see us again soon *sigh*."); + addGoodbye("I hope we'll meet again soon *sigh*."); } }; npc.setEntityClass("oldwitchnpc"); npc.setPosition(12, 4); npc.initHP(100); - npc.setDescription("You see Mircea. She is an old asthenic witch who seems to become weaken each second."); + npc.setDescription("You see Mircea. She is an old thin witch, who seems to become weaker each second."); zone.add(npc); } } From ee9d8ea63be3fc58a3c73028d8442ccbe25570ef Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Tue, 12 Apr 2011 17:43:50 +0000 Subject: [PATCH 04/14] backported fix for "Xhiphin takes more than one flask of water"- ID: 3284741 reported by monsterdhal. The action now defaults to only taking 1 item but you could also specify a larger amount (by kymara) --- .../npc/action/DropInfostringItemAction.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/games/stendhal/server/entity/npc/action/DropInfostringItemAction.java b/src/games/stendhal/server/entity/npc/action/DropInfostringItemAction.java index bb74d6bad8..0b70e6a200 100644 --- a/src/games/stendhal/server/entity/npc/action/DropInfostringItemAction.java +++ b/src/games/stendhal/server/entity/npc/action/DropInfostringItemAction.java @@ -32,6 +32,7 @@ public class DropInfostringItemAction implements ChatAction { private static Logger logger = Logger.getLogger(DropItemAction.class); private final String itemName; private final String infostring; + private final int amount; /** * Creates a new DropInfostringItemAction. @@ -43,6 +44,23 @@ public class DropInfostringItemAction implements ChatAction { */ public DropInfostringItemAction(final String itemName, final String infostring) { this.itemName = itemName; + this.amount = 1; + this.infostring = infostring; + } + + /** + * Creates a new DropInfostringItemAction. + * + * @param itemName + * name of item + * @param amount + * amount of item + * @param infostring + * infostring of the dropped item + */ + public DropInfostringItemAction(final String itemName, final int amount, final String infostring) { + this.itemName = itemName; + this.amount = amount; this.infostring = infostring; } @@ -51,7 +69,7 @@ public class DropInfostringItemAction implements ChatAction { boolean res = false; for (final Item item : items) { if (infostring.equalsIgnoreCase(item.getInfoString())) { - res = player.drop(item); + res = player.drop(item.getName(), amount); break; } } @@ -64,7 +82,7 @@ public class DropInfostringItemAction implements ChatAction { @Override public String toString() { - return "drop item <" + itemName + "> with infostring <" + infostring + ">"; + return "drop " + amount + " of item <" + itemName + "> with infostring <" + infostring + ">"; } @Override @@ -87,6 +105,9 @@ public class DropInfostringItemAction implements ChatAction { if (!infostring.equals(other.infostring)) { return false; } + if (amount != other.amount) { + return false; + } if (itemName == null) { if (other.itemName != null) { return false; From a475f9ede962deb9237fbf3d35fdb7cbd212774c Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Tue, 12 Apr 2011 22:43:35 +0000 Subject: [PATCH 05/14] make sure that player text is cleared on exceptions in beginTurn --- .../core/engine/StendhalRPRuleProcessor.java | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/games/stendhal/server/core/engine/StendhalRPRuleProcessor.java b/src/games/stendhal/server/core/engine/StendhalRPRuleProcessor.java index 6bcd4c6e16..ffef286f71 100644 --- a/src/games/stendhal/server/core/engine/StendhalRPRuleProcessor.java +++ b/src/games/stendhal/server/core/engine/StendhalRPRuleProcessor.java @@ -262,24 +262,41 @@ public class StendhalRPRuleProcessor implements IRPRuleProcessor { final long start = System.nanoTime(); try { - destroyObsoleteZones(); - - logNumberOfPlayersOnline(); - - handleKilledEntities(); - - executePlayerLogic(); - - executeNPCsPreLogic(); - - handlePlayersRmTexts(); - } catch (final Exception e) { logger.error("error in beginTurn", e); - } finally { - logger.debug("Begin turn: " + (System.nanoTime() - start) / 1000000.0); } + + try { + logNumberOfPlayersOnline(); + } catch (final Exception e) { + logger.error("error in beginTurn", e); + } + + try { + handleKilledEntities(); + } catch (final Exception e) { + logger.error("error in beginTurn", e); + } + + try { + executePlayerLogic(); + } catch (final Exception e) { + logger.error("error in beginTurn", e); + } + + try { + executeNPCsPreLogic(); + } catch (final Exception e) { + logger.error("error in beginTurn", e); + } + + try { + handlePlayersRmTexts(); + } catch (final Exception e) { + logger.error("error in beginTurn", e); + } + logger.debug("Begin turn: " + (System.nanoTime() - start) / 1000000.0); } private void destroyObsoleteZones() { From 87a0001ea74b8004abcdedb4ad283941b3705799 Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Wed, 13 Apr 2011 00:23:45 +0000 Subject: [PATCH 06/14] backported harold fixes --- .../stendhal/server/entity/trade/Market.java | 20 +++++++++------ .../stendhal/server/entity/trade/Offer.java | 25 +++++++++++++++++++ .../tavern/market/AcceptOfferHandler.java | 12 +++++---- .../tavern/market/ExamineOfferChatAction.java | 9 ++++--- .../semos/tavern/market/OfferExpirer.java | 10 +++++--- .../tavern/market/ProlongOfferHandler.java | 9 ++++--- .../tavern/market/RemoveOfferHandler.java | 7 ++++-- .../market/ShowOfferItemsChatAction.java | 2 +- .../tavern/market/ShowOffersChatAction.java | 12 +++++---- 9 files changed, 75 insertions(+), 31 deletions(-) diff --git a/src/games/stendhal/server/entity/trade/Market.java b/src/games/stendhal/server/entity/trade/Market.java index 63e80adb20..4a319a652d 100644 --- a/src/games/stendhal/server/entity/trade/Market.java +++ b/src/games/stendhal/server/entity/trade/Market.java @@ -219,7 +219,7 @@ public class Market extends PassiveEntity { * @param acceptingPlayer */ public boolean acceptOffer(final Offer offer, final Player acceptingPlayer) { - if (getSlot(OFFERS_SLOT_NAME).has(offer.getID())) { + if (getSlot(OFFERS_SLOT_NAME).has(offer.getID()) && offer.hasItem()) { int price = offer.getPrice().intValue(); // Take the money; free items should always succeed if ((price == 0) || acceptingPlayer.drop("money", price)) { @@ -354,9 +354,8 @@ public class Market extends PassiveEntity { slotName = item.getContainerSlot().getName(); target = "slot"; } - new ItemLogger() - .addLogItemEventCommand(new LogSimpleItemEventCommand(item, p, - "market-to-" + target, item.get("name"), Integer + new ItemLogger().addLogItemEventCommand(new LogSimpleItemEventCommand(item, p, + "market-to-" + target, o.getItemName(), Integer .toString(getQuantity(item)), "remove offer", slotName)); } @@ -371,8 +370,11 @@ public class Market extends PassiveEntity { this.getSlot(OFFERS_SLOT_NAME).remove(o.getID()); this.getSlot(EXPIRED_OFFERS_SLOT_NAME).add(o); this.getZone().storeToDatabase(); - new GameEvent("market", "expire-offer", o.getOfferer(), o.getItem() - .getName(), o.getPrice().toString()).raise(); + String itemname = "null"; + if (o.hasItem()) { + itemname = o.getItem().getName(); + } + new GameEvent("market", "expire-offer", o.getOfferer(), itemname, o.getPrice().toString()).raise(); } /** @@ -395,8 +397,10 @@ public class Market extends PassiveEntity { this.getSlot(EXPIRED_OFFERS_SLOT_NAME).remove(offerToRemove.getID()); Item item = offerToRemove.getItem(); - new ItemLogger().destroy(null, this.getSlot(EXPIRED_OFFERS_SLOT_NAME), - item, "timeout"); + if (item != null) { + new ItemLogger().destroy(null, this.getSlot(EXPIRED_OFFERS_SLOT_NAME), + item, "timeout"); + } this.getZone().storeToDatabase(); } diff --git a/src/games/stendhal/server/entity/trade/Offer.java b/src/games/stendhal/server/entity/trade/Offer.java index f0295c2513..dd32956985 100644 --- a/src/games/stendhal/server/entity/trade/Offer.java +++ b/src/games/stendhal/server/entity/trade/Offer.java @@ -112,9 +112,33 @@ public class Offer extends Entity implements Dateable { * @return the Item for sale */ public final Item getItem() { + if (getSlot(OFFER_ITEM_SLOT_NAME).size() == 0) { + return null; + } return (Item) getSlot(OFFER_ITEM_SLOT_NAME).iterator().next(); } + /** + * checks if an item is attached to this offer. + * @return true, if this offer has an item + */ + public boolean hasItem() { + return (hasSlot(OFFER_ITEM_SLOT_NAME) && getSlot(OFFER_ITEM_SLOT_NAME).size() != 0); + } + + /** + * gets the name of the item + * + * @return name of item or "null", if there is no item in this offer + */ + public String getItemName() { + if (hasItem()) { + return getItem().getName(); + } + logger.error("Trying to get item name from empty slot", new Throwable()); + return "null"; + } + /** * @return the price to pay for this offer when accepting it */ @@ -180,4 +204,5 @@ public class Offer extends Entity implements Dateable { return cid; } } + } diff --git a/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java index 2124f8984e..ca09b5eaed 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java @@ -68,11 +68,13 @@ public class AcceptOfferHandler extends OfferHandler { } if(offerMap.containsKey(offerNumber)) { Offer o = offerMap.get(offerNumber); - setOffer(o); - int quantity = getQuantity(o.getItem()); - npc.say("Do you want to buy " + Grammar.quantityplnoun(quantity, o.getItem().getName(), "a") + " for " + o.getPrice() + " money?"); - npc.setCurrentState(ConversationStates.BUY_PRICE_OFFERED); - return; + if (o.hasItem()) { + setOffer(o); + int quantity = getQuantity(o.getItem()); + npc.say("Do you want to buy " + Grammar.quantityplnoun(quantity, o.getItem().getName(), "a") + " for " + o.getPrice() + " money?"); + npc.setCurrentState(ConversationStates.BUY_PRICE_OFFERED); + return; + } } npc.say("Sorry, please choose a number from those I told you to accept an offer."); } catch (NumberFormatException e) { diff --git a/src/games/stendhal/server/maps/semos/tavern/market/ExamineOfferChatAction.java b/src/games/stendhal/server/maps/semos/tavern/market/ExamineOfferChatAction.java index 614a7e83b2..a1884ffe41 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/ExamineOfferChatAction.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/ExamineOfferChatAction.java @@ -42,10 +42,11 @@ public class ExamineOfferChatAction extends KnownOffersChatAction { } if(offerMap.containsKey(offerNumber)) { Offer o = offerMap.get(offerNumber); - - player.sendPrivateText(o.getItem().describe()); - showImage(player, o.getItem()); - return; + if (o.hasItem()) { + player.sendPrivateText(o.getItem().describe()); + showImage(player, o.getItem()); + return; + } } npc.say("Sorry, please choose a number from those I told you."); } catch (NumberFormatException e) { diff --git a/src/games/stendhal/server/maps/semos/tavern/market/OfferExpirer.java b/src/games/stendhal/server/maps/semos/tavern/market/OfferExpirer.java index 3dde119896..5dc4498e1b 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/OfferExpirer.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/OfferExpirer.java @@ -120,7 +120,11 @@ public class OfferExpirer implements TurnListener{ market.expireOffer(offer); StringBuilder builder = new StringBuilder(); builder.append("Your offer of "); - builder.append(Grammar.a_noun(offer.getItem().getName())); + String itemname = "unknown item"; + if (offer.hasItem()) { + itemname = offer.getItem().getName(); + } + builder.append(Grammar.a_noun(itemname)); builder.append(" has expired. You have "); builder.append(TimeUtil.approxTimeUntil((int) ((offer.getTimestamp() - System.currentTimeMillis() + 1000 * TIME_TO_REMOVING) / 1000))); @@ -139,7 +143,7 @@ public class OfferExpirer implements TurnListener{ market.removeExpiredOffer(offer); StringBuilder builder = new StringBuilder(); builder.append("Your offer of "); - builder.append(Grammar.a_noun(offer.getItem().getName())); + builder.append(Grammar.a_noun(offer.getItemName())); builder.append(" has been removed permanently from the market."); sendMessage(offer.getOfferer(), builder); } @@ -163,7 +167,7 @@ public class OfferExpirer implements TurnListener{ StringBuilder builder = new StringBuilder(); builder.append("Your offer of "); - builder.append(Grammar.a_noun(offer.getItem().getName())); + builder.append(Grammar.a_noun(offer.getItemName())); builder.append(" will expire in "); builder.append(TimeUtil.approxTimeUntil((int) ((offer.getTimestamp() - time) / 1000 + TIME_TO_EXPIRING))); builder.append("."); diff --git a/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java index ebe30e877e..161e1087eb 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java @@ -62,12 +62,15 @@ public class ProlongOfferHandler extends OfferHandler { Offer o = offerMap.get(offerNumber); if(o.getOfferer().equals(player.getName())) { setOffer(o); - int quantity = getQuantity(o.getItem()); + int quantity = 1; + if (o.hasItem()) { + quantity = getQuantity(o.getItem()); + } StringBuilder message = new StringBuilder(); if (TradeCenterZoneConfigurator.getShopFromZone(player.getZone()).contains(o)) { message.append("Your offer of "); - message.append(Grammar.quantityplnoun(quantity, o.getItem().getName(), "one")); + message.append(Grammar.quantityplnoun(quantity, o.getItemName(), "one")); message.append(" would expire in "); message.append(TimeUtil.approxTimeUntil((int) ((o.getTimestamp() - System.currentTimeMillis() + 1000 * OfferExpirer.TIME_TO_EXPIRING) / 1000))); message.append(". Do you want to prolong it to last for "); @@ -77,7 +80,7 @@ public class ProlongOfferHandler extends OfferHandler { message.append(" money?"); } else { message.append("Do you want to prolong your offer of "); - message.append(Grammar.quantityplnoun(quantity, o.getItem().getName(), "one")); + message.append(Grammar.quantityplnoun(quantity, o.getItemName(), "one")); message.append(" at a price of "); message.append(o.getPrice()); message.append(" for a fee of "); diff --git a/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java index 539c831f3c..4d14411324 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java @@ -61,8 +61,11 @@ public class RemoveOfferHandler extends OfferHandler { setOffer(o); // Ask for confirmation only if the offer is still active if (TradeCenterZoneConfigurator.getShopFromZone(player.getZone()).contains(o)) { - int quantity = getQuantity(o.getItem()); - npc.say("Do you want to remove your offer of " + Grammar.quantityplnoun(quantity, o.getItem().getName(), "one") + "?"); + int quantity = 1; + if (o.hasItem()) { + quantity = getQuantity(o.getItem()); + } + npc.say("Do you want to remove your offer of " + Grammar.quantityplnoun(quantity, o.getItemName(), "one") + "?"); npc.setCurrentState(ConversationStates.QUESTION_1); } else { removeOffer(player, npc); diff --git a/src/games/stendhal/server/maps/semos/tavern/market/ShowOfferItemsChatAction.java b/src/games/stendhal/server/maps/semos/tavern/market/ShowOfferItemsChatAction.java index 74fe2b1fdb..6730db7790 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/ShowOfferItemsChatAction.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/ShowOfferItemsChatAction.java @@ -70,7 +70,7 @@ public class ShowOfferItemsChatAction implements ChatAction { private Set buildItemList(List offers) { Set items = new TreeSet(); for (Offer offer : offers) { - items.add(offer.getItem().getName()); + items.add(offer.getItemName()); } return items; } diff --git a/src/games/stendhal/server/maps/semos/tavern/market/ShowOffersChatAction.java b/src/games/stendhal/server/maps/semos/tavern/market/ShowOffersChatAction.java index 4439ec7a0c..c46148b900 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/ShowOffersChatAction.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/ShowOffersChatAction.java @@ -168,10 +168,12 @@ public class ShowOffersChatAction implements ChatAction { private void filterForWord(List offers, String word) { Iterator it = offers.iterator(); while (it.hasNext()) { - Item item = it.next().getItem(); - - if (!(item.getName().indexOf(word) != -1 || word.equals(item.getItemClass()))) { - it.remove(); + Offer o = it.next(); + if (o.hasItem()) { + Item item = o.getItem(); + if (!(item.getName().indexOf(word) != -1 || word.equals(item.getItemClass()))) { + it.remove(); + } } } } @@ -207,7 +209,7 @@ public class ShowOffersChatAction implements ChatAction { message.append(counter); message.append(": "); - message.append(Grammar.quantityplnoun(quantity, item.getName(), "a")); + message.append(Grammar.quantityplnoun(quantity, offer.getItemName(), "a")); message.append(" for "); message.append(offer.getPrice()); message.append(" money"); From 0808733fd05d637587093fa01e39c450ffaed2bb Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Wed, 13 Apr 2011 00:33:32 +0000 Subject: [PATCH 07/14] fixed another NullPointerException --- .../server/maps/semos/tavern/market/AcceptOfferHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java index ca09b5eaed..a5fa051c43 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java @@ -87,11 +87,12 @@ public class AcceptOfferHandler extends OfferHandler { public void fire (Player player, Sentence sentence, EventRaiser npc) { Offer offer = getOffer(); Market m = TradeCenterZoneConfigurator.getShopFromZone(player.getZone()); + String itemname = offer.getItemName(); if (m.acceptOffer(offer,player)) { // Successful trade. Tell the offerer StringBuilder earningToFetchMessage = new StringBuilder(); earningToFetchMessage.append("Your "); - earningToFetchMessage.append(offer.getItem().getName()); + earningToFetchMessage.append(itemname); earningToFetchMessage.append(" was sold. You can now fetch your earnings from me."); logger.debug("sending a notice to '" + offer.getOfferer() + "': " + earningToFetchMessage.toString()); From d97c01953573378cfc3ff179dd31f66e366e38e4 Mon Sep 17 00:00:00 2001 From: Markus Date: Wed, 13 Apr 2011 17:56:17 +0000 Subject: [PATCH 08/14] Backport for #3285546 and #3285547 --- src/games/stendhal/server/entity/trade/Market.java | 4 +++- .../server/maps/semos/tavern/market/AcceptOfferHandler.java | 2 +- .../maps/semos/tavern/market/ProlongOfferHandler.java | 2 +- .../server/maps/semos/tavern/market/RemoveOfferHandler.java | 6 +++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/games/stendhal/server/entity/trade/Market.java b/src/games/stendhal/server/entity/trade/Market.java index 4a319a652d..9c0915b894 100644 --- a/src/games/stendhal/server/entity/trade/Market.java +++ b/src/games/stendhal/server/entity/trade/Market.java @@ -337,6 +337,8 @@ public class Market extends PassiveEntity { */ public void removeOffer(Offer o, Player p) { Item item = o.getItem(); + String itemName = item.getName(); + o.getSlot(Offer.OFFER_ITEM_SLOT_NAME).remove(item.getID()); p.equipOrPutOnGround(item); @@ -355,7 +357,7 @@ public class Market extends PassiveEntity { target = "slot"; } new ItemLogger().addLogItemEventCommand(new LogSimpleItemEventCommand(item, p, - "market-to-" + target, o.getItemName(), Integer + "market-to-" + target, itemName, Integer .toString(getQuantity(item)), "remove offer", slotName)); } diff --git a/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java index a5fa051c43..d8771699fa 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/AcceptOfferHandler.java @@ -100,7 +100,7 @@ public class AcceptOfferHandler extends OfferHandler { npc.say("Thanks."); // Obsolete the offers, since the list has changed - ((MarketManagerNPC) npc.getEntity()).getOfferMap().put(player.getName(), null); + ((MarketManagerNPC) npc.getEntity()).getOfferMap().clear(); } else { // Trade failed for some reason. Check why, and inform the player if (!m.contains(offer)) { diff --git a/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java index 161e1087eb..e18c2ba752 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/ProlongOfferHandler.java @@ -115,7 +115,7 @@ public class ProlongOfferHandler extends OfferHandler { npc.say("Sorry, that offer has already been removed from the market."); } // Changed the status, or it has been changed by expiration. Obsolete the offers - ((MarketManagerNPC) npc.getEntity()).getOfferMap().put(player.getName(), null); + ((MarketManagerNPC) npc.getEntity()).getOfferMap().clear(); } else { npc.say("You cannot afford the trading fee of "+fee.toString()); } diff --git a/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java b/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java index 4d14411324..0e8c446252 100644 --- a/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java +++ b/src/games/stendhal/server/maps/semos/tavern/market/RemoveOfferHandler.java @@ -51,7 +51,7 @@ public class RemoveOfferHandler extends OfferHandler { try { String offerNumber = getOfferNumberFromSentence(sentence).toString(); Map offerMap = manager.getOfferMap(); - if (offerMap == null) { + if (offerMap.isEmpty()) { npc.say("Please check your offers first."); return; } @@ -69,6 +69,8 @@ public class RemoveOfferHandler extends OfferHandler { npc.setCurrentState(ConversationStates.QUESTION_1); } else { removeOffer(player, npc); + // Changed the status, or it has been changed by expiration. Obsolete the offers + ((MarketManagerNPC) npc.getEntity()).getOfferMap().clear(); } return; } @@ -85,6 +87,8 @@ public class RemoveOfferHandler extends OfferHandler { protected class ConfirmRemoveOfferChatAction implements ChatAction { public void fire(Player player, Sentence sentence, EventRaiser npc) { removeOffer(player, npc); + // Changed the status, or it has been changed by expiration. Obsolete the offers + ((MarketManagerNPC) npc.getEntity()).getOfferMap().clear(); } } From a1dc3b80bc0a7da2a8dcccbc79d9263b8bba6309 Mon Sep 17 00:00:00 2001 From: Katie Russell Date: Wed, 13 Apr 2011 18:39:00 +0000 Subject: [PATCH 09/14] backport bugfix, check for hasKilled - should be hasKilledShared --- .../achievement/factory/KilledSharedAllCreaturesCondition.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/games/stendhal/server/core/rp/achievement/factory/KilledSharedAllCreaturesCondition.java b/src/games/stendhal/server/core/rp/achievement/factory/KilledSharedAllCreaturesCondition.java index 390114a3d2..6d7811208b 100644 --- a/src/games/stendhal/server/core/rp/achievement/factory/KilledSharedAllCreaturesCondition.java +++ b/src/games/stendhal/server/core/rp/achievement/factory/KilledSharedAllCreaturesCondition.java @@ -26,7 +26,6 @@ import org.apache.commons.lang.builder.HashCodeBuilder; /** * Did the player kill all creatures, shared? (excluding rare) * - * @author kymara */ public class KilledSharedAllCreaturesCondition implements ChatCondition { @@ -35,7 +34,7 @@ public class KilledSharedAllCreaturesCondition implements ChatCondition { final Collection creatures = SingletonRepository.getEntityManager().getCreatures(); for (Creature creature : creatures) { if (!creature.isRare()) { - if (!player.hasKilled(creature.getName())) { + if (!player.hasKilledShared(creature.getName())) { return false; } } From d6a5afb5e56bc2e53152f1cda7d33bdffb4498be Mon Sep 17 00:00:00 2001 From: Katie Russell Date: Wed, 13 Apr 2011 19:17:35 +0000 Subject: [PATCH 10/14] backport fix for: greater potions request gets substituted with potions - ID: 3285554 --- .../server/entity/npc/parser/NameSearch.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/games/stendhal/server/entity/npc/parser/NameSearch.java b/src/games/stendhal/server/entity/npc/parser/NameSearch.java index 59b3c072e7..b1663bacc4 100644 --- a/src/games/stendhal/server/entity/npc/parser/NameSearch.java +++ b/src/games/stendhal/server/entity/npc/parser/NameSearch.java @@ -49,18 +49,31 @@ public final class NameSearch { boolean found = false; final String itemName = item.getNormalized(); + for(Map.Entry e : parsedNames.entrySet()) { Sentence parsed = e.getValue(); - - if (itemName.endsWith(parsed.getOriginalText()) || - itemName.endsWith(parsed.getNormalized()) || - parsed.matchesNormalized(itemName)) { + + if (parsed.matchesNormalized(itemName)) { name = e.getKey(); found = true; break; } } - + + if (!found) { + // see if instead the end matches, this is deliberately done afterwards because of bug #3285554 + for(Map.Entry e : parsedNames.entrySet()) { + Sentence parsed = e.getValue(); + + if (itemName.endsWith(parsed.getOriginalText()) || + itemName.endsWith(parsed.getNormalized())) { + name = e.getKey(); + found = true; + break; + } + } + } + if (!found) { // see if instead the plural matches final String pluralName = Grammar.plural(itemName); From 3c9b341f9685f16ed35a02745e5e5fd942475178 Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Sat, 16 Apr 2011 18:35:55 +0000 Subject: [PATCH 11/14] backported clear popup menu cache on item change (fixes #3288255) --- src/games/stendhal/client/gui/ItemPanel.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/games/stendhal/client/gui/ItemPanel.java b/src/games/stendhal/client/gui/ItemPanel.java index 30dbc9f72d..2e74188ed1 100644 --- a/src/games/stendhal/client/gui/ItemPanel.java +++ b/src/games/stendhal/client/gui/ItemPanel.java @@ -157,6 +157,8 @@ public class ItemPanel extends JComponent implements DropTarget { } else { setCursor(null); } + // The old popup menu is no longer valid + popupMenu = null; } /** From 8c31b303497d0e7f0b01545bfede5314f7759fc1 Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Sat, 16 Apr 2011 18:41:29 +0000 Subject: [PATCH 12/14] updated version number --- README.txt | 4 ++-- build.ant.properties | 4 ++-- runserver.bat | 2 +- runserver.sh | 2 +- src/games/stendhal/client/update/Version.java | 2 +- src/games/stendhal/common/Debug.java | 2 +- src/games/stendhal/server/core/engine/GenerateINI.java | 2 +- stendhal.jnlp | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.txt b/README.txt index db88423c78..0ded1397e2 100644 --- a/README.txt +++ b/README.txt @@ -39,12 +39,12 @@ Java is included in most Linux distributions. Both Sun Java and OpenJDK are supp Please download Stendhal from http://arianne.sourceforge.net Then unzip the client zip into a new folder. -You can double click on stendhal-0.93.jar and the client will run. +You can double click on stendhal-0.93.1.jar and the client will run. If you prefer to run from command line, then just execute this command in the stendhal folder: - java -jar stendhal-0.93.jar + java -jar stendhal-0.93.1.jar Alternatively you can run it using Java Webstart technology at: diff --git a/build.ant.properties b/build.ant.properties index f6cbfbe92d..a2f562d88e 100644 --- a/build.ant.properties +++ b/build.ant.properties @@ -72,8 +72,8 @@ updates_server = http://arianne.sourceforge.net/stendhal/updates version_server = http://arianne.sourceforge.net/stendhal.version # current version of stendhal -version.old = 0.92 -version = 0.93 +version.old = 0.93 +version = 0.93.1 # javac options javac.deprecation = true diff --git a/runserver.bat b/runserver.bat index 34d41ef4fb..cdb76a2b1d 100644 --- a/runserver.bat +++ b/runserver.bat @@ -1,3 +1,3 @@ -set STENDHAL_VERSION=0.93 +set STENDHAL_VERSION=0.93.1 set LOCALCLASSPATH=.;data\script;data\conf;stendhal-server-%STENDHAL_VERSION%.jar;marauroa.jar;mysql-connector.jar;log4j.jar;commons-lang.jar;h2.jar java -Xmx400m -cp "%LOCALCLASSPATH%" marauroa.server.marauroad -c server.ini -l diff --git a/runserver.sh b/runserver.sh index aa0bc841af..9ebc4484a6 100644 --- a/runserver.sh +++ b/runserver.sh @@ -1,5 +1,5 @@ #!/bin/sh -STENDHAL_VERSION="0.93" +STENDHAL_VERSION="0.93.1" LOCALCLASSPATH=.:data/script/:data/conf/:stendhal-server-$STENDHAL_VERSION.jar:marauroa.jar:mysql-connector.jar:log4j.jar:commons-lang.jar:h2.jar diff --git a/src/games/stendhal/client/update/Version.java b/src/games/stendhal/client/update/Version.java index 30a296fcdd..3895ff2c64 100644 --- a/src/games/stendhal/client/update/Version.java +++ b/src/games/stendhal/client/update/Version.java @@ -10,7 +10,7 @@ package games.stendhal.client.update; public class Version { /** Version Number. */ - private static final String VERSION = "0.93"; + private static final String VERSION = "0.93.1"; /** * Extract the specified number of parts from a version-string. diff --git a/src/games/stendhal/common/Debug.java b/src/games/stendhal/common/Debug.java index 5ce9739e3f..e649bfa59b 100644 --- a/src/games/stendhal/common/Debug.java +++ b/src/games/stendhal/common/Debug.java @@ -26,7 +26,7 @@ public class Debug { /** version. */ // Note: This line is updated by build.xml using a regexp so be sure to adjust it in case you modify this line. - public static final String VERSION = "0.93"; + public static final String VERSION = "0.93.1"; public static final String PRE_RELEASE_VERSION = null; diff --git a/src/games/stendhal/server/core/engine/GenerateINI.java b/src/games/stendhal/server/core/engine/GenerateINI.java index afeba66635..9d017dd449 100644 --- a/src/games/stendhal/server/core/engine/GenerateINI.java +++ b/src/games/stendhal/server/core/engine/GenerateINI.java @@ -271,7 +271,7 @@ public class GenerateINI { out.println(); out.println("server_typeGame=" + gameName); out.println("server_name=" + gameName + " Marauroa server"); - out.println("server_version=0.93"); + out.println("server_version=0.93.1"); out.println("server_contact=https://sourceforge.net/tracker/?atid=514826&group_id=66537&func=browse"); out.println(); out.println("# Extensions configured on the server. Enable at will."); diff --git a/stendhal.jnlp b/stendhal.jnlp index d3ffa607b0..2a9b485aeb 100644 --- a/stendhal.jnlp +++ b/stendhal.jnlp @@ -22,7 +22,7 @@ Some of these people are NPC, they will give you tasks to accomplish and hints t - + From a95fcc004dca5200c1025833cdc4e76b730e847c Mon Sep 17 00:00:00 2001 From: Hendrik Brummermann Date: Mon, 18 Apr 2011 05:42:46 +0000 Subject: [PATCH 13/14] temporariely deactivated item path (fixes #3288649) --- src/games/stendhal/server/actions/equip/SourceObject.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/games/stendhal/server/actions/equip/SourceObject.java b/src/games/stendhal/server/actions/equip/SourceObject.java index ddfb9bb246..c883135fd9 100644 --- a/src/games/stendhal/server/actions/equip/SourceObject.java +++ b/src/games/stendhal/server/actions/equip/SourceObject.java @@ -65,10 +65,11 @@ class SourceObject extends MoveableObject { } SourceObject source; - if (action.has(EquipActionConsts.SOURCE_PATH)) { + /* TODO: disabled because of + * if (action.has(EquipActionConsts.SOURCE_PATH)) { source = createSource(action, player); // Otherwise use compatibility mode - } else if (action.has(EquipActionConsts.BASE_OBJECT)) { + } else*/if (action.has(EquipActionConsts.BASE_OBJECT)) { source = createSourceForContainedItem(action, player); } else { source = createSourceForNonContainedItem(action, player); From c2e8c7a73604e9f149541af615544dd169ab1328 Mon Sep 17 00:00:00 2001 From: Markus Date: Fri, 22 Apr 2011 11:28:15 +0000 Subject: [PATCH 14/14] Backport: [ arianne-Bugs-3291068 ] loot achievements vulnerable to cheats * set flag "from corpse" to false when sth is added to a stackable --- src/games/stendhal/server/entity/item/StackableItem.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/games/stendhal/server/entity/item/StackableItem.java b/src/games/stendhal/server/entity/item/StackableItem.java index cfa4307050..f443fb758e 100644 --- a/src/games/stendhal/server/entity/item/StackableItem.java +++ b/src/games/stendhal/server/entity/item/StackableItem.java @@ -102,6 +102,9 @@ public class StackableItem extends Item implements Stackable { public int add(final StackableItem other) { if (this.isStackable(other)) { setQuantity(other.getQuantity() + getQuantity()); + // set flag to false to prevent abuse by adding to a stackable in a corpse + // leading to a too high number awarded when looting + this.setFromCorpse(false); } return getQuantity(); }