diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index bf98f38b6f..22dc2cf5fe 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -853,4 +853,10 @@ Incrementado quiz de 3rd job, agora utilizando um pool de 40 perguntas com escol 05 - 10 Março 2018, Corrigido diseases não sendo removidas corretamente no cliente quando tentando trocar de canal/entrar Cash Shop, permitindo-as ficar no jogador infinitamente. Corrigido Holy Symbol atuando de forma inesperada no cenário com somente um jogador. -Corrigido Summon Sack lv. 9 lançando mob com id inexistente. \ No newline at end of file +Corrigido Summon Sack lv. 9 lançando mob com id inexistente. +Corrigido NPC de guild tirando mesos do jogador sem efetuar a ação alguma caso o número máximo de jogadores tenha sido alcançado. + +11 - 12 Março 2018, +Localhost melhorado: retirado caps de Matk, Mdef, Wdef, Acc e Avoid. +Balanceado Ninja Ambush, agora dando uma quantidade de dano justificável. +Implementado questline do Dyle. \ No newline at end of file diff --git a/scripts/npc/9900000.js b/scripts/npc/9900000.js index 2c139e4944..f267914e84 100644 --- a/scripts/npc/9900000.js +++ b/scripts/npc/9900000.js @@ -40,12 +40,18 @@ var facenew = Array(); var colors = Array(); function start() { + if(cm.getPlayer().gmLevel() < 2) { + cm.sendOk("Hey wassup?"); + cm.dispose(); + return; + } + cm.sendSimple("Hey there, I can change your look. What would you like to change?\r\n#L0#Skin#l\r\n#L1#Hair#l\r\n#L5#Female Hair#l\r\n#L2#Hair Color#l\r\n#L3#Eye#l\r\n#L6#Female Eyes#l\r\n#L4#Eye Color#l\r\n#L7#Set GM job#l"); } function action(mode, type, selection) { status++; - if (mode != 1 || cm.getPlayer().gmLevel() < 1){ + if (mode != 1 || cm.getPlayer().gmLevel() < 2){ cm.dispose(); return; } diff --git a/scripts/npc/9900001.js b/scripts/npc/9900001.js index cb5ffa3104..c5d17ce633 100644 --- a/scripts/npc/9900001.js +++ b/scripts/npc/9900001.js @@ -26,11 +26,12 @@ * @Purpose: Levels people up. */ function start() { - cm.sendYesNo("Do you want to level up?"); + if(cm.getPlayer().gmLevel() > 1) cm.sendYesNo("Do you want to level up?"); + else cm.sendOk("Hey wassup?"); } function action(i, am, pro) { - if (i > 0 && cm.getPlayer().gmLevel() > 0) + if (i > 0 && cm.getPlayer().gmLevel() > 1) cm.getPlayer().levelUp(true); cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/commands.js b/scripts/npc/commands.js index 45c6b0b443..20f6e5bb40 100644 --- a/scripts/npc/commands.js +++ b/scripts/npc/commands.js @@ -175,6 +175,7 @@ function writeSolaxiaCommandsLv2() { //JrGM addCommand("setstat", ""); addCommand("maxstat", ""); addCommand("maxskill", ""); + addCommand("resetskill", ""); addCommand("mesos", ""); addCommand("search", ""); addCommand("jail", ""); @@ -216,6 +217,7 @@ function writeSolaxiaCommandsLv0() { //Common addCommand("joinevent", ""); addCommand("leaveevent", ""); addCommand("bosshp", ""); + addCommand("mobhp", ""); addCommand("ranks", ""); } diff --git a/scripts/quest/2214.js b/scripts/quest/2214.js new file mode 100644 index 0000000000..b1f2f33075 --- /dev/null +++ b/scripts/quest/2214.js @@ -0,0 +1,59 @@ +/* + This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server + Copyleft (L) 2017 RonanLana + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/* + Author : Ronan + NPC Name: Knocked Trash Can + Map(s): Hut in the Swamp + Description: Quest - The Run-down Huts in the Swamp + Quest ID: 2214 +*/ + +var status = -1; + +function end(mode, type, selection) { + if (mode == -1) { + qm.dispose(); + } else { + if(mode == 0 && type > 0) { + qm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0) { + if(!qm.canHold(4031894, 1)) { + qm.sendNext("(Eh, I can't hold the #t4031894# right now, I need an ETC slot available.)"); + qm.dispose(); + return; + } + + qm.sendNext("(Ah, there is a crumbled note here... Hm, it contains details about some scheme that is about to happen, that must be what #r#p1052002##k was talking about.)"); + qm.gainItem(4031894, 1); + qm.gainExp(20000 * qm.getPlayer().getExpRate()); + qm.forceCompleteQuest(); + + qm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/quest/2215.js b/scripts/quest/2215.js new file mode 100644 index 0000000000..edb50c6a13 --- /dev/null +++ b/scripts/quest/2215.js @@ -0,0 +1,65 @@ +/* + This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server + Copyleft (L) 2017 RonanLana + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/* + Author : Ronan + NPC Name: Find the Crumpled Piece of Paper Again + Map(s): Hut in the Swamp + Description: Quest - The Run-down Huts in the Swamp + Quest ID: 2215 +*/ + +var status = -1; + +function end(mode, type, selection) { + if (mode == -1) { + qm.dispose(); + } else { + if(mode == 0 && type > 0) { + qm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0) { + if(qm.getMeso() < 2000) { + qm.sendNext("(Oh, I don't have the combined fee amount yet.)"); + qm.dispose(); + return; + } + + if(!qm.canHold(4031894, 1)) { + qm.sendNext("(Eh, I can't hold the #t4031894# right now, I need an ETC slot available.)"); + qm.dispose(); + return; + } + + qm.sendNext("(Alright, now I will deposit the fee there and get the paper... That's it, yea, that's done.)"); + qm.gainItem(4031894, 1); + qm.gainMeso(-2000); + qm.forceCompleteQuest(); + + qm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/quest/2216.js b/scripts/quest/2216.js new file mode 100644 index 0000000000..0daf60319a --- /dev/null +++ b/scripts/quest/2216.js @@ -0,0 +1,45 @@ +/* + This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server + Copyleft (L) 2017 RonanLana + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +var status = -1; + +function start(mode, type, selection) { + if (mode == -1) { + qm.dispose(); + } else { + if(mode == 0 && type > 0) { + qm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0) { + qm.sendNext("I've just gathered an interesting information, #rDyle looks just like regular Ligators#k, but bigger."); + qm.gainExp(7000 * qm.getPlayer().getExpRate()); + qm.forceCompleteQuest(); + + qm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/quest/2217.js b/scripts/quest/2217.js new file mode 100644 index 0000000000..3d05669b62 --- /dev/null +++ b/scripts/quest/2217.js @@ -0,0 +1,45 @@ +/* + This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server + Copyleft (L) 2017 RonanLana + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +var status = -1; + +function start(mode, type, selection) { + if (mode == -1) { + qm.dispose(); + } else { + if(mode == 0 && type > 0) { + qm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0) { + qm.sendNext("Hey, did you notice already, it looks like some awful stench is emanating from the sewers... Ewww"); + qm.gainExp(7000 * qm.getPlayer().getExpRate()); + qm.forceCompleteQuest(); + + qm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/quest/2218.js b/scripts/quest/2218.js new file mode 100644 index 0000000000..88dc060c71 --- /dev/null +++ b/scripts/quest/2218.js @@ -0,0 +1,45 @@ +/* + This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server + Copyleft (L) 2017 RonanLana + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +var status = -1; + +function start(mode, type, selection) { + if (mode == -1) { + qm.dispose(); + } else { + if(mode == 0 && type > 0) { + qm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0) { + qm.sendNext("Hey did you see how strange #rLakelis#k has been acting these days? We should see what's going on aabout her, her actions have been so weird lately..."); + qm.gainExp(7000 * qm.getPlayer().getExpRate()); + qm.forceCompleteQuest(); + + qm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/quest/2219.js b/scripts/quest/2219.js new file mode 100644 index 0000000000..15d25d730e --- /dev/null +++ b/scripts/quest/2219.js @@ -0,0 +1,45 @@ +/* + This file is part of the HeavenMS (MapleSolaxiaV2) MapleStory Server + Copyleft (L) 2017 RonanLana + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +var status = -1; + +function start(mode, type, selection) { + if (mode == -1) { + qm.dispose(); + } else { + if(mode == 0 && type > 0) { + qm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0) { + qm.sendNext("Did you know, they say someone from the sewers has been trying to #rdevelop a magic powder that let's one to grow#k, isn't that nice?"); + qm.gainExp(7000 * qm.getPlayer().getExpRate()); + qm.forceCompleteQuest(); + + qm.dispose(); + } + } +} \ No newline at end of file diff --git a/sql/db_shopupdate.sql b/sql/db_shopupdate.sql index 3cd5ad5b74..5b4647eb16 100644 --- a/sql/db_shopupdate.sql +++ b/sql/db_shopupdate.sql @@ -255,7 +255,8 @@ INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `position`) VALUES (1337, 2043712, 1, 81), (1337, 2340000, 1, 82), (1337, 2040807, 1, 83), -(1337, 2210032, 1, 84); +(1337, 2210032, 1, 84), +(1337, 2050004, 1, 85); # Thanks to DietStory dev team INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `pitch`, `position`) VALUES diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 732d22a946..25f7109243 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -5547,6 +5547,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { ps.close(); ret.cashshop = new CashShop(ret.accountid, ret.id, ret.getJobType()); ret.autoban = new AutobanManager(ret); + ret.marriageRing = null; //for now ps = con.prepareStatement("SELECT name, level FROM characters WHERE accountid = ? AND id != ? ORDER BY level DESC limit 1"); ps.setInt(1, ret.accountid); ps.setInt(2, charid); diff --git a/src/client/command/Commands.java b/src/client/command/Commands.java index 8e2fa5b4bd..b3fcea7ad7 100644 --- a/src/client/command/Commands.java +++ b/src/client/command/Commands.java @@ -651,6 +651,15 @@ public class Commands { } break; + case "mobhp": + for(MapleMonster monster : player.getMap().getMonsters()) { + if(monster != null && monster.getHp() > 0) { + player.yellowMessage(monster.getName() + " (" + monster.getId() + ") has " + monster.getHp() + " / " + monster.getMaxHp() + " HP."); + + } + } + break; + case "ranks": PreparedStatement ps = null; ResultSet rs = null; @@ -1329,6 +1338,30 @@ public class Commands { player.yellowMessage("Skills maxed out."); break; + case "resetskill": + for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img").getChildren()) { + try { + skill = SkillFactory.getSkill(Integer.parseInt(skill_.getName())); + player.changeSkillLevel(skill, (byte) 0, skill.getMaxLevel(), -1); + } catch (NumberFormatException nfe) { + nfe.printStackTrace(); + break; + } catch (NullPointerException npe) { + continue; + } + } + + if(player.getJob().isA(MapleJob.ARAN1) || player.getJob().isA(MapleJob.LEGEND)) { + skill = SkillFactory.getSkill(5001005); + player.changeSkillLevel(skill, (byte) -1, -1, -1); + } else { + skill = SkillFactory.getSkill(21001001); + player.changeSkillLevel(skill, (byte) -1, -1, -1); + } + + player.yellowMessage("Skills reseted."); + break; + case "mesos": if (sub.length >= 2) { player.gainMeso(Integer.parseInt(sub[1]), true); @@ -2394,8 +2427,8 @@ public class Commands { case "cake": MapleMonster monster = MapleLifeFactory.getMonster(9400606); if(sub.length > 1) { - int newHp = Integer.parseInt(sub[1]); - if(newHp < 0) newHp = Integer.MAX_VALUE; + double mobHp = Double.parseDouble(sub[1]); + int newHp = (mobHp <= 0) ? Integer.MAX_VALUE : ((mobHp > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) mobHp); monster.getStats().setHp(newHp); monster.setStartingHp(newHp); diff --git a/src/server/life/MapleMonster.java b/src/server/life/MapleMonster.java index f8ae171659..d07e56e318 100644 --- a/src/server/life/MapleMonster.java +++ b/src/server/life/MapleMonster.java @@ -899,7 +899,7 @@ public class MapleMonster extends AbstractLoadedMapleLife { } else if (status.getSkill().getId() == 4121004 || status.getSkill().getId() == 4221004) { // Ninja Ambush final Skill skill = SkillFactory.getSkill(status.getSkill().getId()); final byte level = from.getSkillLevel(skill); - final int damage = (int) ((from.getStr() + from.getLuk()) * (1.5 + (level * 0.05)) * skill.getEffect(level).getDamage()); + final int damage = (int) ((from.getStr() + from.getLuk()) * ((3.7 * skill.getEffect(level).getDamage()) / 100)); status.setValue(MonsterStatus.NINJA_AMBUSH, Integer.valueOf(damage)); animationTime = broadcastStatusEffect(status); @@ -1164,7 +1164,7 @@ public class MapleMonster extends AbstractLoadedMapleLife { } if (damage > 0) { damage(chr, damage, true); - if (type == 1 || type == 2) { + if (type == 1) { // ninja ambush (type 2) is already displaying DOT map.broadcastMessage(MaplePacketCreator.damageMonster(getObjectId(), damage), getPosition()); } }