Source for my MapleSolaxiaV2 (v83 MapleStory).
This commit is contained in:
ronancpl
2015-11-02 23:17:21 -02:00
parent 324982e94f
commit 972517e7b2
1675 changed files with 261831 additions and 0 deletions

View File

@@ -0,0 +1,748 @@
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
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 <http://www.gnu.org/licenses/>.
*/
package scripting;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import tools.DatabaseConnection;
import java.awt.Point;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import net.server.Server;
import net.server.channel.Channel;
import net.server.guild.MapleGuild;
import net.server.world.MapleParty;
import net.server.world.MaplePartyCharacter;
import scripting.event.EventManager;
import scripting.npc.NPCScriptManager;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.expeditions.MapleExpedition;
import server.expeditions.MapleExpeditionType;
import server.life.MapleLifeFactory;
import server.life.MapleMonster;
import server.life.MobSkill;
import server.life.MobSkillFactory;
import server.maps.MapleMap;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.partyquest.PartyQuest;
import server.partyquest.Pyramid;
import server.quest.MapleQuest;
import tools.MaplePacketCreator;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleQuestStatus;
import client.SkillFactory;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import client.inventory.ModifyInventory;
import client.inventory.PetDataFactory;
import constants.ItemConstants;
import constants.ServerConstants;
public class AbstractPlayerInteraction {
public MapleClient c;
public AbstractPlayerInteraction(MapleClient c) {
this.c = c;
}
public MapleClient getClient() {
return c;
}
public MapleCharacter getPlayer() {
return c.getPlayer();
}
public void warp(int map) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(0));
}
public void warp(int map, int portal) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(portal));
}
public void warp(int map, String portal) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(portal));
}
public void warpMap(int map) {
getPlayer().getMap().warpEveryone(map);
}
public void warpParty(int id) {
for (MapleCharacter mc : getPartyMembers()) {
if (id == 925020100) {
mc.setDojoParty(true);
}
mc.changeMap(getWarpMap(id));
}
}
public List<MapleCharacter> getPartyMembers() {
if (getPlayer().getParty() == null) {
return null;
}
List<MapleCharacter> chars = new LinkedList<>();
for (Channel channel : Server.getInstance().getChannelsFromWorld(getPlayer().getWorld())) {
for (MapleCharacter chr : channel.getPartyMembers(getPlayer().getParty())) {
if (chr != null) {
chars.add(chr);
}
}
}
return chars;
}
protected MapleMap getWarpMap(int map) {
MapleMap target;
if (getPlayer().getEventInstance() == null) {
target = c.getChannelServer().getMapFactory().getMap(map);
} else {
target = getPlayer().getEventInstance().getMapInstance(map);
}
return target;
}
public MapleMap getMap(int map) {
return getWarpMap(map);
}
public EventManager getEventManager(String event) {
return getClient().getChannelServer().getEventSM().getEventManager(event);
}
public MapleInventory getInventory(MapleInventoryType type) {
return getPlayer().getInventory(type);
}
public boolean hasItem(int itemid){
return haveItem(itemid, 1);
}
public boolean hasItem(int itemid, int quantity){
return haveItem(itemid, quantity);
}
public boolean haveItem(int itemid) {
return haveItem(itemid, 1);
}
public boolean haveItem(int itemid, int quantity) {
return getPlayer().getItemQuantity(itemid, false) >= quantity;
}
public boolean canHold(int itemid) {
return canHold(itemid, 1);
}
public boolean canHold(int itemid, int quantity) {
if(haveItem(itemid)) {
if(getPlayer().getItemQuantity(itemid, false) + quantity <= MapleItemInformationProvider.getInstance().getSlotMax(c, itemid))
return true;
}
return getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemid)).getNextFreeSlot() > -1;
}
//---- \/ \/ \/ \/ \/ \/ \/ NOT TESTED \/ \/ \/ \/ \/ \/ \/ \/ \/ ----
public final MapleQuestStatus getQuestRecord(final int id) {
return c.getPlayer().getQuestNAdd(MapleQuest.getInstance(id));
}
public final MapleQuestStatus getQuestNoRecord(final int id) {
return c.getPlayer().getQuestNoAdd(MapleQuest.getInstance(id));
}
//---- /\ /\ /\ /\ /\ /\ /\ NOT TESTED /\ /\ /\ /\ /\ /\ /\ /\ /\ ----
public void openNpc(int npcid) {
openNpc(npcid, null);
}
public void openNpc(int npcid, String script) {
c.removeClickedNPC();
NPCScriptManager.getInstance().dispose(c);
NPCScriptManager.getInstance().start(c, npcid, script, null);
}
public void updateQuest(int questid, String data) {
MapleQuestStatus status = c.getPlayer().getQuest(MapleQuest.getInstance(questid));
status.setStatus(MapleQuestStatus.Status.STARTED);
status.setProgress(0, data);//override old if exists
c.getPlayer().updateQuest(status);
}
public MapleQuestStatus.Status getQuestStatus(int id) {
return c.getPlayer().getQuest(MapleQuest.getInstance(id)).getStatus();
}
public boolean isQuestCompleted(int quest) {
try {
return getQuestStatus(quest) == MapleQuestStatus.Status.COMPLETED;
} catch (NullPointerException e) {
e.printStackTrace();
return false;
}
}
public boolean isQuestActive(int quest) {
return isQuestStarted(quest);
}
public boolean isQuestStarted(int quest) {
try {
return getQuestStatus(quest) == MapleQuestStatus.Status.STARTED;
} catch (NullPointerException e) {
e.printStackTrace();
return false;
}
}
public int getQuestProgress(int qid) {
return Integer.parseInt(getPlayer().getQuest(MapleQuest.getInstance(qid)).getProgress().get(0));
}
public Item evolvePet(byte slot, int afterId) {
MaplePet evolved = null;
MaplePet target = null;
Item tmp;
long period = 90; //refreshes expiration date: 90 days
period *= 24;
period *= 60;
period *= 60;
period *= 1000;
target = getPlayer().getPet(slot);
if(target == null) {
getPlayer().message("Pet could not be evolved...");
return(null);
}
tmp = gainItem(afterId, (short)1, false, true, period, target);
getPlayer().unequipPet(target, true, false);
/*
evolved = MaplePet.loadFromDb(tmp.getItemId(), tmp.getPosition(), tmp.getPetId());
evolved = tmp.getPet();
if(evolved == null) {
getPlayer().message("Pet structure non-existent for " + tmp.getItemId() + "...");
return(null);
}
else if(tmp.getPetId() == -1) {
getPlayer().message("Pet id -1");
return(null);
}
getPlayer().addPet(evolved);
getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showPet(c.getPlayer(), evolved, false, false), true);
c.announce(MaplePacketCreator.petStatUpdate(c.getPlayer()));
c.announce(MaplePacketCreator.enableActions());
getPlayer().startFullnessSchedule(PetDataFactory.getHunger(evolved.getItemId()), evolved, getPlayer().getPetIndex(evolved));
*/
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.CASH, target.getPosition(), (short) 1, false);
return evolved;
}
public void gainItem(int id, short quantity) {
gainItem(id, quantity, false, true);
}
public void gainItem(int id, short quantity, boolean show) {//this will fk randomStats equip :P
gainItem(id, quantity, false, show);
}
public void gainItem(int id, boolean show) {
gainItem(id, (short) 1, false, show);
}
public void gainItem(int id) {
gainItem(id, (short) 1, false, true);
}
public Item gainItem(int id, short quantity, boolean randomStats, boolean showMessage) {
return gainItem(id, quantity, randomStats, showMessage, -1);
}
public Item gainItem(int id, short quantity, boolean randomStats, boolean showMessage, long expires) {
return gainItem(id, quantity, randomStats, showMessage, expires, null);
}
public Item gainItem(int id, short quantity, boolean randomStats, boolean showMessage, long expires, MaplePet from) {
Item item = null;
MaplePet evolved = null;
int petId = -1;
if (id >= 5000000 && id <= 5000100) {
petId = MaplePet.createPet(id);
if(from != null) {
evolved = MaplePet.loadFromDb(id, (short) 0, petId);
Point pos = getPlayer().getPosition();
pos.y -= 12;
evolved.setPos(pos);
evolved.setFh(getPlayer().getMap().getFootholds().findBelow(evolved.getPos()).getId());
evolved.setStance(0);
evolved.setSummoned(true);
evolved.setName(from.getName());
evolved.setCloseness(from.getCloseness());
evolved.setFullness(from.getFullness());
evolved.setLevel(from.getLevel());
evolved.saveToDb();
}
//MapleInventoryManipulator.addById(c, id, (short) 1, null, petId, expires == -1 ? -1 : System.currentTimeMillis() + expires);
}
if (quantity >= 0) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ii.getInventoryType(id).equals(MapleInventoryType.EQUIP)) {
item = ii.getEquipById(id);
if(ServerConstants.USE_ENHANCED_CRAFTING == true && c.getPlayer().getCS() == true)
item = MapleItemInformationProvider.getInstance().scrollEquipWithId(item, 2049100, true, c.getPlayer().isGM());
} else {
item = new Item(id, (short) 0, quantity, petId);
}
if(expires >= 0)
item.setExpiration(System.currentTimeMillis() + expires);
item.setPetId(petId);
if (!MapleInventoryManipulator.checkSpace(c, id, quantity, "")) {
c.getPlayer().dropMessage(1, "Your inventory is full. Please remove an item from your " + ii.getInventoryType(id).name() + " inventory.");
return null;
}
if (ii.getInventoryType(id).equals(MapleInventoryType.EQUIP) && !ItemConstants.isRechargable(item.getItemId())) {
if (randomStats) {
item = ii.randomizeStats((Equip) item);
MapleInventoryManipulator.addFromDrop(c, ii.randomizeStats((Equip) item), false, petId);
} else {
MapleInventoryManipulator.addFromDrop(c, (Equip) item, false, petId);
}
} else {
MapleInventoryManipulator.addFromDrop(c, item, false, petId);
}
} else {
MapleInventoryManipulator.removeById(c, MapleItemInformationProvider.getInstance().getInventoryType(id), id, -quantity, true, false);
}
if (showMessage) {
c.announce(MaplePacketCreator.getShowItemGain(id, quantity, true));
}
return item;
}
public void gainFame(int delta) {
c.getPlayer().addFame(delta);
c.announce(MaplePacketCreator.getShowFameGain(delta));
}
public void changeMusic(String songName) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.musicChange(songName));
}
public void playerMessage(int type, String message) {
c.announce(MaplePacketCreator.serverNotice(type, message));
}
public void message(String message) {
getPlayer().message(message);
}
public void mapMessage(int type, String message) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.serverNotice(type, message));
}
public void mapEffect(String path) {
c.announce(MaplePacketCreator.mapEffect(path));
}
public void mapSound(String path) {
c.announce(MaplePacketCreator.mapSound(path));
}
public void displayAranIntro() {
String intro = "";
switch (c.getPlayer().getMapId()) {
case 914090010:
intro = "Effect/Direction1.img/aranTutorial/Scene0";
break;
case 914090011:
intro = "Effect/Direction1.img/aranTutorial/Scene1" + (c.getPlayer().getGender() == 0 ? "0" : "1");
break;
case 914090012:
intro = "Effect/Direction1.img/aranTutorial/Scene2" + (c.getPlayer().getGender() == 0 ? "0" : "1");
break;
case 914090013:
intro = "Effect/Direction1.img/aranTutorial/Scene3";
break;
case 914090100:
intro = "Effect/Direction1.img/aranTutorial/HandedPoleArm" + (c.getPlayer().getGender() == 0 ? "0" : "1");
break;
case 914090200:
intro = "Effect/Direction1.img/aranTutorial/Maha";
break;
}
showIntro(intro);
}
public void showIntro(String path) {
c.announce(MaplePacketCreator.showIntro(path));
}
public void showInfo(String path) {
c.announce(MaplePacketCreator.showInfo(path));
c.announce(MaplePacketCreator.enableActions());
}
public void guildMessage(int type, String message) {
if (getGuild() != null) {
getGuild().guildMessage(MaplePacketCreator.serverNotice(type, message));
}
}
public MapleGuild getGuild() {
try {
return Server.getInstance().getGuild(getPlayer().getGuildId(), getPlayer().getWorld(), null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public MapleParty getParty() {
return getPlayer().getParty();
}
public boolean isLeader() {
if(getParty() == null)
return false;
return getParty().getLeader().equals(getPlayer().getMPC());
}
public void givePartyItems(int id, short quantity, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
MapleClient cl = chr.getClient();
if (quantity >= 0) {
MapleInventoryManipulator.addById(cl, id, quantity);
} else {
MapleInventoryManipulator.removeById(cl, MapleItemInformationProvider.getInstance().getInventoryType(id), id, -quantity, true, false);
}
cl.announce(MaplePacketCreator.getShowItemGain(id, quantity, true));
}
}
public void removeHPQItems() {
int[] items = {4001095, 4001096, 4001097, 4001098, 4001099, 4001100, 4001101};
for (int i = 0; i < items.length; i ++) {
removePartyItems(items[i]);
}
}
public void removePartyItems(int id) {
if (getParty() == null) {
removeAll(id);
return;
}
for (MaplePartyCharacter chr : getParty().getMembers()) {
if (chr != null && chr.isOnline() && chr.getPlayer().getClient() != null){
removeAll(id, chr.getPlayer().getClient());
}
}
}
public void givePartyExp(int amount, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
chr.gainExp((amount * chr.getExpRate()), true, true);
}
}
public void givePartyExp(String PQ) {
givePartyExp(PQ, true);
}
public void givePartyExp(String PQ, boolean instance) {
//1 player = 0% bonus (100)
//2 players = 0% bonus (100)
//3 players = +0% bonus (100)
//4 players = +10% bonus (110)
//5 players = +20% bonus (120)
//6 players = +30% bonus (130)
MapleParty party = getPlayer().getParty();
int size = party.getMembers().size();
if(instance) {
for(MaplePartyCharacter member: party.getMembers()) {
if(member == null || !member.isOnline() || member.getPlayer().getEventInstance() == null){
size--;
}
}
}
int bonus = size < 4 ? 100 : 70 + (size * 10);
for (MaplePartyCharacter member : party.getMembers()) {
if(member == null || !member.isOnline()){
continue;
}
MapleCharacter player = member.getPlayer();
if(instance && player.getEventInstance() == null){
continue; // They aren't in the instance, don't give EXP.
}
int base = PartyQuest.getExp(PQ, player.getLevel());
int exp = base * player.getExpRate();
exp = exp * bonus / 100;
player.gainExp(exp, true, true);
if(ServerConstants.PQ_BONUS_EXP_MOD > 0 && System.currentTimeMillis() <= ServerConstants.EVENT_END_TIMESTAMP) {
player.gainExp((int) (exp * ServerConstants.PQ_BONUS_EXP_MOD), true, true);
}
}
}
public void removeFromParty(int id, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(id);
MapleInventory iv = chr.getInventory(type);
int possesed = iv.countById(id);
if (possesed > 0) {
MapleInventoryManipulator.removeById(c, MapleItemInformationProvider.getInstance().getInventoryType(id), id, possesed, true, false);
chr.announce(MaplePacketCreator.getShowItemGain(id, (short) -possesed, true));
}
}
}
public void removeAll(int id) {
removeAll(id, c);
}
public void removeAll(int id, MapleClient cl) {
MapleInventoryType invType = MapleItemInformationProvider.getInstance().getInventoryType(id);
int possessed = cl.getPlayer().getInventory(invType).countById(id);
if (possessed > 0) {
MapleInventoryManipulator.removeById(cl, MapleItemInformationProvider.getInstance().getInventoryType(id), id, possessed, true, false);
cl.announce(MaplePacketCreator.getShowItemGain(id, (short) -possessed, true));
}
if(invType == MapleInventoryType.EQUIP) {
if(cl.getPlayer().getInventory(MapleInventoryType.EQUIPPED).countById(id) > 0) {
MapleInventoryManipulator.removeById(cl, MapleInventoryType.EQUIPPED, id, 1, true, false);
cl.announce(MaplePacketCreator.getShowItemGain(id, (short) -1, true));
}
}
}
public int getMapId() {
return c.getPlayer().getMap().getId();
}
public int getPlayerCount(int mapid) {
return c.getChannelServer().getMapFactory().getMap(mapid).getCharacters().size();
}
public void showInstruction(String msg, int width, int height) {
c.announce(MaplePacketCreator.sendHint(msg, width, height));
c.announce(MaplePacketCreator.enableActions());
}
public void disableMinimap() {
c.announce(MaplePacketCreator.disableMinimap());
}
public void resetMap(int mapid) {
getMap(mapid).resetReactors();
getMap(mapid).killAllMonsters();
for (MapleMapObject i : getMap(mapid).getMapObjectsInRange(c.getPlayer().getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM))) {
getMap(mapid).removeMapObject(i);
getMap(mapid).broadcastMessage(MaplePacketCreator.removeItemFromMap(i.getObjectId(), 0, c.getPlayer().getId()));
}
}
public void sendClock(MapleClient d, int time) {
d.announce(MaplePacketCreator.getClock((int) (time - System.currentTimeMillis()) / 1000));
}
public void useItem(int id) {
MapleItemInformationProvider.getInstance().getItemEffect(id).applyTo(c.getPlayer());
c.announce(MaplePacketCreator.getItemMessage(id));//Useful shet :3
}
public void cancelItem(final int id) {
getPlayer().cancelEffect(MapleItemInformationProvider.getInstance().getItemEffect(id), false, -1);
}
public void teachSkill(int skillid, byte level, byte masterLevel, long expiration) {
getPlayer().changeSkillLevel(SkillFactory.getSkill(skillid), level, masterLevel, expiration);
}
public void removeEquipFromSlot(short slot) {
Item tempItem = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(slot);
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIPPED, slot, tempItem.getQuantity(), false, false);
}
public void gainAndEquip(int itemid, short slot) {
final Item old = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(slot);
if (old != null) {
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIPPED, slot, old.getQuantity(), false, false);
}
final Item newItem = MapleItemInformationProvider.getInstance().getEquipById(itemid);
newItem.setPosition(slot);
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(newItem);
c.announce(MaplePacketCreator.modifyInventory(false, Collections.singletonList(new ModifyInventory(0, newItem))));
}
public void spawnMonster(int id, int x, int y) {
MapleMonster monster = MapleLifeFactory.getMonster(id);
monster.setPosition(new Point(x, y));
getPlayer().getMap().spawnMonster(monster);
}
public MapleMonster getMonsterLifeFactory(int mid) {
return MapleLifeFactory.getMonster(mid);
}
public void spawnGuide() {
c.announce(MaplePacketCreator.spawnGuide(true));
}
public void removeGuide() {
c.announce(MaplePacketCreator.spawnGuide(false));
}
public void displayGuide(int num) {
c.announce(MaplePacketCreator.showInfo("UI/tutorial.img/" + num));
}
public void goDojoUp() {
c.announce(MaplePacketCreator.dojoWarpUp());
}
public void enableActions() {
c.announce(MaplePacketCreator.enableActions());
}
public void showEffect(String effect){
c.announce(MaplePacketCreator.showEffect(effect));
}
public void dojoEnergy() {
c.announce(MaplePacketCreator.getEnergy("energy", getPlayer().getDojoEnergy()));
}
public void talkGuide(String message) {
c.announce(MaplePacketCreator.talkGuide(message));
}
public void guideHint(int hint) {
c.announce(MaplePacketCreator.guideHint(hint));
}
public void updateAreaInfo(Short area, String info) {
c.getPlayer().updateAreaInfo(area, info);
c.announce(MaplePacketCreator.enableActions());//idk, nexon does the same :P
}
public boolean containsAreaInfo(short area, String info) {
return c.getPlayer().containsAreaInfo(area, info);
}
public MobSkill getMobSkill(int skill, int level) {
return MobSkillFactory.getMobSkill(skill, level);
}
public void earnTitle(String msg) {
c.announce(MaplePacketCreator.earnTitleMessage(msg));
}
public void showInfoText(String msg) {
c.announce(MaplePacketCreator.showInfoText(msg));
}
public void openUI(byte ui) {
c.announce(MaplePacketCreator.openUI(ui));
}
public void lockUI() {
c.announce(MaplePacketCreator.disableUI(true));
c.announce(MaplePacketCreator.lockUI(true));
}
public void unlockUI() {
c.announce(MaplePacketCreator.disableUI(false));
c.announce(MaplePacketCreator.lockUI(false));
}
public void playSound(String sound) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.environmentChange(sound, 4));
}
public void environmentChange(String env, int mode) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.environmentChange(env, mode));
}
public Pyramid getPyramid() {
return (Pyramid) getPlayer().getPartyQuest();
}
public void createExpedition(MapleExpeditionType type) {
MapleExpedition exped = new MapleExpedition(getPlayer(), type);
getPlayer().getClient().getChannelServer().getExpeditions().add(exped);
}
public void endExpedition(MapleExpedition exped) {
exped.dispose(true);
getPlayer().getClient().getChannelServer().getExpeditions().remove(exped);
}
public MapleExpedition getExpedition(MapleExpeditionType type) {
for (MapleExpedition exped : getPlayer().getClient().getChannelServer().getExpeditions()) {
if (exped.getType().equals(type)) {
return exped;
}
}
return null;
}
}