use of net.server.world.MapleParty in project HeavenMS by ronancpl.
the class MapleMonster method distributeExperience.
public void distributeExperience(int killerId) {
if (isAlive()) {
return;
}
int minThresholdLevel = calcThresholdLevel(this.getMap().getEventInstance() != null);
int exp = getExp();
long totalHealth = maxHpPlusHeal.get();
Map<Integer, Integer> expDist = new HashMap<>();
Map<Integer, Integer> partyExp = new HashMap<>();
// 80% of pool is split amongst all the damagers
float exp8perHp = (0.8f * exp) / totalHealth;
// 20% of pool goes to the killer or his/her party
float exp2 = (0.2f * exp);
for (Entry<Integer, AtomicInteger> damage : takenDamage.entrySet()) {
expDist.put(damage.getKey(), (int) (Math.min((exp8perHp * damage.getValue().get()), Integer.MAX_VALUE)));
}
Collection<MapleCharacter> chrs = map.getCharacters();
Set<MapleCharacter> underleveled = new LinkedHashSet<>();
for (MapleCharacter mc : chrs) {
if (expDist.containsKey(mc.getId())) {
boolean isKiller = (mc.getId() == killerId);
int xp = expDist.get(mc.getId());
if (isKiller) {
xp = (int) Math.min(exp2 + xp, Integer.MAX_VALUE);
}
MapleParty p = mc.getParty();
if (p != null) {
int pID = p.getId();
long pXP = (long) xp + (partyExp.containsKey(pID) ? partyExp.get(pID) : 0);
partyExp.put(pID, (int) Math.min(pXP, Integer.MAX_VALUE));
} else {
if (mc.getLevel() >= minThresholdLevel) {
// NO EXP WILL BE GIVEN for those who are underleveled!
giveExpToCharacter(mc, xp, isKiller, 1);
} else {
underleveled.add(mc);
}
}
}
}
for (Entry<Integer, Integer> party : partyExp.entrySet()) {
distributeExperienceToParty(party.getKey(), party.getValue(), killerId, underleveled, minThresholdLevel);
}
for (MapleCharacter mc : underleveled) {
mc.showUnderleveledInfo(this);
}
}
use of net.server.world.MapleParty in project HeavenMS by ronancpl.
the class MapleCharacter method loadCharFromDB.
public static MapleCharacter loadCharFromDB(int charid, MapleClient client, boolean channelserver) throws SQLException {
try {
MapleCharacter ret = new MapleCharacter();
ret.client = client;
ret.id = charid;
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM characters WHERE id = ?");
ps.setInt(1, charid);
ResultSet rs = ps.executeQuery();
if (!rs.next()) {
rs.close();
ps.close();
throw new RuntimeException("Loading char failed (not found)");
}
ret.name = rs.getString("name");
ret.level = rs.getInt("level");
ret.fame = rs.getInt("fame");
ret.quest_fame = rs.getInt("fquest");
ret.str = rs.getInt("str");
ret.dex = rs.getInt("dex");
ret.int_ = rs.getInt("int");
ret.luk = rs.getInt("luk");
ret.exp.set(rs.getInt("exp"));
ret.gachaexp.set(rs.getInt("gachaexp"));
ret.hp = rs.getInt("hp");
ret.maxhp = rs.getInt("maxhp");
ret.mp = rs.getInt("mp");
ret.maxmp = rs.getInt("maxmp");
ret.hpMpApUsed = rs.getInt("hpMpUsed");
ret.hasMerchant = rs.getInt("HasMerchant") == 1;
String[] skillPoints = rs.getString("sp").split(",");
for (int i = 0; i < ret.remainingSp.length; i++) {
ret.remainingSp[i] = Integer.parseInt(skillPoints[i]);
}
ret.remainingAp = rs.getInt("ap");
ret.meso.set(rs.getInt("meso"));
ret.merchantmeso = rs.getInt("MerchantMesos");
ret.gmLevel = rs.getInt("gm");
ret.skinColor = MapleSkinColor.getById(rs.getInt("skincolor"));
ret.gender = rs.getInt("gender");
ret.job = MapleJob.getById(rs.getInt("job"));
ret.finishedDojoTutorial = rs.getInt("finishedDojoTutorial") == 1;
ret.vanquisherKills = rs.getInt("vanquisherKills");
ret.omokwins = rs.getInt("omokwins");
ret.omoklosses = rs.getInt("omoklosses");
ret.omokties = rs.getInt("omokties");
ret.matchcardwins = rs.getInt("matchcardwins");
ret.matchcardlosses = rs.getInt("matchcardlosses");
ret.matchcardties = rs.getInt("matchcardties");
ret.hair = rs.getInt("hair");
ret.face = rs.getInt("face");
ret.accountid = rs.getInt("accountid");
ret.mapid = rs.getInt("map");
ret.jailExpiration = rs.getLong("jailexpire");
ret.initialSpawnPoint = rs.getInt("spawnpoint");
ret.world = rs.getByte("world");
ret.rank = rs.getInt("rank");
ret.rankMove = rs.getInt("rankMove");
ret.jobRank = rs.getInt("jobRank");
ret.jobRankMove = rs.getInt("jobRankMove");
int mountexp = rs.getInt("mountexp");
int mountlevel = rs.getInt("mountlevel");
int mounttiredness = rs.getInt("mounttiredness");
ret.guildid = rs.getInt("guildid");
ret.guildRank = rs.getInt("guildrank");
ret.allianceRank = rs.getInt("allianceRank");
ret.familyId = rs.getInt("familyId");
ret.bookCover = rs.getInt("monsterbookcover");
ret.monsterbook = new MonsterBook();
ret.monsterbook.loadCards(charid);
ret.vanquisherStage = rs.getInt("vanquisherStage");
ret.dojoPoints = rs.getInt("dojoPoints");
ret.dojoStage = rs.getInt("lastDojoStage");
ret.dataString = rs.getString("dataString");
ret.mgc = new MapleGuildCharacter(ret);
int buddyCapacity = rs.getInt("buddyCapacity");
ret.buddylist = new BuddyList(buddyCapacity);
ret.getInventory(MapleInventoryType.EQUIP).setSlotLimit(rs.getByte("equipslots"));
ret.getInventory(MapleInventoryType.USE).setSlotLimit(rs.getByte("useslots"));
ret.getInventory(MapleInventoryType.SETUP).setSlotLimit(rs.getByte("setupslots"));
ret.getInventory(MapleInventoryType.ETC).setSlotLimit(rs.getByte("etcslots"));
for (Pair<Item, MapleInventoryType> item : ItemFactory.INVENTORY.loadItems(ret.id, !channelserver)) {
ret.getInventory(item.getRight()).addFromDB(item.getLeft());
Item itemz = item.getLeft();
if (itemz.getPetId() > -1) {
MaplePet pet = itemz.getPet();
if (pet != null && pet.isSummoned()) {
ret.addPet(pet);
}
continue;
}
if (item.getRight().equals(MapleInventoryType.EQUIP) || item.getRight().equals(MapleInventoryType.EQUIPPED)) {
Equip equip = (Equip) item.getLeft();
if (equip.getRingId() > -1) {
MapleRing ring = MapleRing.loadFromDb(equip.getRingId());
if (item.getRight().equals(MapleInventoryType.EQUIPPED)) {
ring.equip();
}
if (ring.getItemId() > 1112012) {
ret.addFriendshipRing(ring);
} else {
ret.addCrushRing(ring);
}
}
}
}
NewYearCardRecord.loadPlayerNewYearCards(ret);
PreparedStatement ps2, ps3;
ResultSet rs2, rs3;
ps3 = con.prepareStatement("SELECT petid FROM inventoryitems WHERE characterid = ? AND petid > -1");
ps3.setInt(1, charid);
rs3 = ps3.executeQuery();
while (rs3.next()) {
int petId = rs3.getInt("petid");
ps2 = con.prepareStatement("SELECT itemid FROM petignores WHERE petid = ?");
ps2.setInt(1, petId);
ret.resetExcluded(petId);
rs2 = ps2.executeQuery();
while (rs2.next()) {
ret.addExcluded(petId, rs2.getInt("itemid"));
}
ps2.close();
rs2.close();
}
ps3.close();
rs3.close();
ret.commitExcludedItems();
if (channelserver) {
MapleMapFactory mapFactory = client.getChannelServer().getMapFactory();
ret.map = mapFactory.getMap(ret.mapid);
if (ret.map == null) {
ret.map = mapFactory.getMap(100000000);
}
MaplePortal portal = ret.map.getPortal(ret.initialSpawnPoint);
if (portal == null) {
portal = ret.map.getPortal(0);
ret.initialSpawnPoint = 0;
}
ret.setPosition(portal.getPosition());
int partyid = rs.getInt("party");
MapleParty party = Server.getInstance().getWorld(ret.world).getParty(partyid);
if (party != null) {
ret.mpc = party.getMemberById(ret.id);
if (ret.mpc != null) {
ret.mpc = new MaplePartyCharacter(ret);
ret.party = party;
}
}
int messengerid = rs.getInt("messengerid");
int position = rs.getInt("messengerposition");
if (messengerid > 0 && position < 4 && position > -1) {
MapleMessenger messenger = Server.getInstance().getWorld(ret.world).getMessenger(messengerid);
if (messenger != null) {
ret.messenger = messenger;
ret.messengerposition = position;
}
}
ret.loggedIn = true;
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT mapid,vip FROM trocklocations WHERE characterid = ? LIMIT 15");
ps.setInt(1, charid);
rs = ps.executeQuery();
byte v = 0;
byte r = 0;
while (rs.next()) {
if (rs.getInt("vip") == 1) {
ret.viptrockmaps.add(rs.getInt("mapid"));
v++;
} else {
ret.trockmaps.add(rs.getInt("mapid"));
r++;
}
}
while (v < 10) {
ret.viptrockmaps.add(999999999);
v++;
}
while (r < 5) {
ret.trockmaps.add(999999999);
r++;
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT name FROM accounts WHERE id = ?", Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, ret.accountid);
rs = ps.executeQuery();
if (rs.next()) {
ret.getClient().setAccountName(rs.getString("name"));
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT `area`,`info` FROM area_info WHERE charid = ?");
ps.setInt(1, ret.id);
rs = ps.executeQuery();
while (rs.next()) {
ret.area_info.put(rs.getShort("area"), rs.getString("info"));
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT `name`,`info` FROM eventstats WHERE characterid = ?");
ps.setInt(1, ret.id);
rs = ps.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
if (rs.getString("name").equals("rescueGaga")) {
ret.events.put(name, new RescueGaga(rs.getInt("info")));
}
// ret.events = new MapleEvents(new RescueGaga(rs.getInt("rescuegaga")), new ArtifactHunt(rs.getInt("artifacthunt")));
}
rs.close();
ps.close();
ret.cashshop = new CashShop(ret.accountid, ret.id, ret.getJobType());
ret.autoban = new AutobanManager(ret);
// for now
ret.marriageRing = null;
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);
rs = ps.executeQuery();
if (rs.next()) {
ret.linkedName = rs.getString("name");
ret.linkedLevel = rs.getInt("level");
}
rs.close();
ps.close();
if (channelserver) {
ps = con.prepareStatement("SELECT * FROM queststatus WHERE characterid = ?");
ps.setInt(1, charid);
rs = ps.executeQuery();
PreparedStatement psf;
try (PreparedStatement pse = con.prepareStatement("SELECT * FROM questprogress WHERE queststatusid = ?")) {
psf = con.prepareStatement("SELECT mapid FROM medalmaps WHERE queststatusid = ?");
while (rs.next()) {
MapleQuest q = MapleQuest.getInstance(rs.getShort("quest"));
MapleQuestStatus status = new MapleQuestStatus(q, MapleQuestStatus.Status.getById(rs.getInt("status")));
long cTime = rs.getLong("time");
if (cTime > -1) {
status.setCompletionTime(cTime * 1000);
}
long eTime = rs.getLong("expires");
if (eTime > 0) {
status.setExpirationTime(eTime);
}
status.setForfeited(rs.getInt("forfeited"));
ret.quests.put(q.getId(), status);
pse.setInt(1, rs.getInt("queststatusid"));
try (ResultSet rsProgress = pse.executeQuery()) {
while (rsProgress.next()) {
status.setProgress(rsProgress.getInt("progressid"), rsProgress.getString("progress"));
}
}
psf.setInt(1, rs.getInt("queststatusid"));
try (ResultSet medalmaps = psf.executeQuery()) {
while (medalmaps.next()) {
status.addMedalMap(medalmaps.getInt("mapid"));
}
}
}
rs.close();
ps.close();
}
psf.close();
ps = con.prepareStatement("SELECT skillid,skilllevel,masterlevel,expiration FROM skills WHERE characterid = ?");
ps.setInt(1, charid);
rs = ps.executeQuery();
while (rs.next()) {
ret.skills.put(SkillFactory.getSkill(rs.getInt("skillid")), new SkillEntry(rs.getByte("skilllevel"), rs.getInt("masterlevel"), rs.getLong("expiration")));
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT SkillID,StartTime,length FROM cooldowns WHERE charid = ?");
ps.setInt(1, ret.getId());
rs = ps.executeQuery();
while (rs.next()) {
final int skillid = rs.getInt("SkillID");
final long length = rs.getLong("length"), startTime = rs.getLong("StartTime");
if (skillid != 5221999 && (length + startTime < System.currentTimeMillis())) {
continue;
}
ret.giveCoolDowns(skillid, startTime, length);
}
rs.close();
ps.close();
ps = con.prepareStatement("DELETE FROM cooldowns WHERE charid = ?");
ps.setInt(1, ret.getId());
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("SELECT * FROM skillmacros WHERE characterid = ?");
ps.setInt(1, charid);
rs = ps.executeQuery();
while (rs.next()) {
int position = rs.getInt("position");
SkillMacro macro = new SkillMacro(rs.getInt("skill1"), rs.getInt("skill2"), rs.getInt("skill3"), rs.getString("name"), rs.getInt("shout"), position);
ret.skillMacros[position] = macro;
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT `key`,`type`,`action` FROM keymap WHERE characterid = ?");
ps.setInt(1, charid);
rs = ps.executeQuery();
while (rs.next()) {
int key = rs.getInt("key");
int type = rs.getInt("type");
int action = rs.getInt("action");
ret.keymap.put(Integer.valueOf(key), new MapleKeyBinding(type, action));
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT `locationtype`,`map`,`portal` FROM savedlocations WHERE characterid = ?");
ps.setInt(1, charid);
rs = ps.executeQuery();
while (rs.next()) {
ret.savedLocations[SavedLocationType.valueOf(rs.getString("locationtype")).ordinal()] = new SavedLocation(rs.getInt("map"), rs.getInt("portal"));
}
rs.close();
ps.close();
ps = con.prepareStatement("SELECT `characterid_to`,`when` FROM famelog WHERE characterid = ? AND DATEDIFF(NOW(),`when`) < 30");
ps.setInt(1, charid);
rs = ps.executeQuery();
ret.lastfametime = 0;
ret.lastmonthfameids = new ArrayList<>(31);
while (rs.next()) {
ret.lastfametime = Math.max(ret.lastfametime, rs.getTimestamp("when").getTime());
ret.lastmonthfameids.add(Integer.valueOf(rs.getInt("characterid_to")));
}
rs.close();
ps.close();
ret.buddylist.loadFromDb(charid);
ret.storage = MapleStorage.loadOrCreateFromDB(ret.accountid, ret.world);
ret.recalcLocalStats();
// ret.resetBattleshipHp();
ret.silentEnforceMaxHpMp();
}
int mountid = ret.getJobType() * 10000000 + 1004;
if (ret.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -18) != null) {
ret.maplemount = new MapleMount(ret, ret.getInventory(MapleInventoryType.EQUIPPED).getItem((short) -18).getItemId(), mountid);
} else {
ret.maplemount = new MapleMount(ret, 0, mountid);
}
ret.maplemount.setExp(mountexp);
ret.maplemount.setLevel(mountlevel);
ret.maplemount.setTiredness(mounttiredness);
ret.maplemount.setActive(false);
con.close();
return ret;
} catch (SQLException | RuntimeException e) {
e.printStackTrace();
}
return null;
}
use of net.server.world.MapleParty in project HeavenMS by ronancpl.
the class PartySearchStartHandler method handlePacket.
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
if (!ServerConstants.USE_PARTY_SEARCH) {
return;
}
int min = slea.readInt();
int max = slea.readInt();
// members
slea.readInt();
int jobs = slea.readInt();
MapleParty party = c.getPlayer().getParty();
if (party == null)
return;
MapleCharacter chr = c.getPlayer();
MapleMap map = chr.getMap();
World world = c.getWorldServer();
Collection<MapleMapObject> mapobjs = map.getPlayers();
for (MapleMapObject mapobj : mapobjs) {
if (party.getMembers().size() > 5) {
break;
}
if (mapobj instanceof MapleCharacter) {
MapleCharacter tchar = (MapleCharacter) mapobj;
int charlvl = tchar.getLevel();
if (charlvl >= min && charlvl <= max && isValidJob(tchar.getJob(), jobs)) {
if (tchar.getParty() == null) {
MaplePartyCharacter partyplayer = new MaplePartyCharacter(tchar);
tchar.getMap().addPartyMember(tchar);
world.updateParty(party.getId(), PartyOperation.JOIN, partyplayer);
tchar.receivePartyMemberHP();
tchar.updatePartyMemberHP();
}
}
}
}
}
Aggregations