Addition of player PvP flag and Karma.

This commit is contained in:
MobiusDevelopment
2019-11-23 02:01:39 +00:00
parent 9c9220457b
commit e111599ee8
18 changed files with 578 additions and 189 deletions

View File

@@ -0,0 +1,19 @@
# ---------------------------------------------------------------------------
# Rate Settings
# ---------------------------------------------------------------------------
# Minimum player karma.
KarmaMin=240
# Maximum player karma.
KarmaMax=10000
# Base karma lost multiplier.
KarmaLostMultiplier=1.0
# Drop item chance percent of each item.
KarmaDropChance=5
# Items that cannot be dropped by karma.
# Separate items with semicolons.
KarmaProtectedItems=57;

View File

@@ -17,6 +17,10 @@
*/ */
package org.l2jmobius; package org.l2jmobius;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.l2jmobius.util.PropertiesParser; import org.l2jmobius.util.PropertiesParser;
/** /**
@@ -34,6 +38,7 @@ public class Config
// -------------------------------------------------- // --------------------------------------------------
private static final String SERVER_CONFIG_FILE = "config/server.ini"; private static final String SERVER_CONFIG_FILE = "config/server.ini";
private static final String RATES_CONFIG_FILE = "config/rates.ini"; private static final String RATES_CONFIG_FILE = "config/rates.ini";
private static final String KARMA_CONFIG_FILE = "config/karma.ini";
// Game // Game
public static String _ip; public static String _ip;
@@ -53,6 +58,12 @@ public class Config
public static float RATE_SP; public static float RATE_SP;
public static float RATE_DROP; public static float RATE_DROP;
public static float RATE_ADENA; public static float RATE_ADENA;
// Karma
public static int KARMA_MIN_KARMA;
public static int KARMA_MAX_KARMA;
public static float KARMA_LOST_MULTIPLIER;
public static int KARMA_DROP_CHANCE;
public static List<Integer> KARMA_PROTECTED_ITEMS;
public static void load() public static void load()
{ {
@@ -87,5 +98,14 @@ public class Config
RATE_SP = ratesSettings.getFloat("RateSp", 1); RATE_SP = ratesSettings.getFloat("RateSp", 1);
RATE_DROP = ratesSettings.getFloat("RateDrop", 1); RATE_DROP = ratesSettings.getFloat("RateDrop", 1);
RATE_ADENA = ratesSettings.getFloat("RateAdena", 1); RATE_ADENA = ratesSettings.getFloat("RateAdena", 1);
// Load karma config file (if exists)
final PropertiesParser karmaSettings = new PropertiesParser(KARMA_CONFIG_FILE);
KARMA_MIN_KARMA = karmaSettings.getInt("KarmaMin", 240);
KARMA_MAX_KARMA = karmaSettings.getInt("KarmaMax", 10000);
KARMA_LOST_MULTIPLIER = karmaSettings.getFloat("KarmaLostMultiplier", 1);
KARMA_DROP_CHANCE = karmaSettings.getInt("KarmaDropChance", 5);
KARMA_PROTECTED_ITEMS = Arrays.stream(karmaSettings.getIntArray("KarmaProtectedItems", ";")).boxed().collect(Collectors.toList());
} }
} }

View File

@@ -721,7 +721,6 @@ public class AdminCommands extends Thread
player.setMaxMp(mpmaxval); player.setMaxMp(mpmaxval);
player.setMaxLoad(loadval); player.setMaxLoad(loadval);
player.setKarma(karmaval); player.setKarma(karmaval);
player.setPvpFlag(pvpflagval);
player.setPvpKills(pvpkillsval); player.setPvpKills(pvpkillsval);
player.setClassId(classidval); player.setClassId(classidval);
StatusUpdate su = new StatusUpdate(player.getObjectId()); StatusUpdate su = new StatusUpdate(player.getObjectId());

View File

@@ -23,12 +23,14 @@ import java.io.InputStreamReader;
import java.io.LineNumberReader; import java.io.LineNumberReader;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
public class MapRegionTable public class MapRegionTable
{ {
private static int[][] _regions = new int[19][21]; private static int[][] _regions = new int[19][21];
private static MapRegionTable _instance; private static MapRegionTable _instance;
private static int[][] _townPositions = new int[13][3];
private static int[][] _karmaPositions = new int[13][3];
public static MapRegionTable getInstance() public static MapRegionTable getInstance()
{ {
@@ -41,7 +43,6 @@ public class MapRegionTable
private MapRegionTable() private MapRegionTable()
{ {
super();
int count = 0; int count = 0;
try try
{ {
@@ -66,6 +67,87 @@ public class MapRegionTable
catch (Exception e) catch (Exception e)
{ {
} }
_townPositions[0][0] = -84176;
_townPositions[0][1] = 243382;
_townPositions[0][2] = -3126;
_townPositions[1][0] = 45525;
_townPositions[1][1] = 48376;
_townPositions[1][2] = -3059;
_townPositions[2][0] = 12181;
_townPositions[2][1] = 16675;
_townPositions[2][2] = -4580;
_townPositions[3][0] = -45232;
_townPositions[3][1] = -113603;
_townPositions[3][2] = -224;
_townPositions[4][0] = 115074;
_townPositions[4][1] = -178115;
_townPositions[4][2] = -880;
_townPositions[5][0] = -14138;
_townPositions[5][1] = 122042;
_townPositions[5][2] = -2988;
_townPositions[6][0] = -82856;
_townPositions[6][1] = 150901;
_townPositions[6][2] = -3128;
_townPositions[7][0] = 18823;
_townPositions[7][1] = 145048;
_townPositions[7][2] = -3126;
_townPositions[8][0] = 83235;
_townPositions[8][1] = 148497;
_townPositions[8][2] = -3404;
_townPositions[9][0] = 80853;
_townPositions[9][1] = 54653;
_townPositions[9][2] = -1524;
_townPositions[10][0] = 147391;
_townPositions[10][1] = 25967;
_townPositions[10][2] = -2012;
_townPositions[11][0] = 117163;
_townPositions[11][1] = 76511;
_townPositions[11][2] = -2712;
_townPositions[12][0] = 83235;
_townPositions[12][1] = 148497;
_townPositions[12][2] = -3404;
// FIXME: Custom locations.
_karmaPositions[0][0] = -88708;
_karmaPositions[0][1] = 237685;
_karmaPositions[0][2] = -3672;
_karmaPositions[1][0] = 40659;
_karmaPositions[1][1] = 56770;
_karmaPositions[1][2] = -3651;
_karmaPositions[2][0] = -346;
_karmaPositions[2][1] = 21889;
_karmaPositions[2][2] = -3256;
_karmaPositions[3][0] = -48359;
_karmaPositions[3][1] = -108190;
_karmaPositions[3][2] = -371;
_karmaPositions[4][0] = 119952;
_karmaPositions[4][1] = -188167;
_karmaPositions[4][2] = -3320;
_karmaPositions[5][0] = -9643;
_karmaPositions[5][1] = 130653;
_karmaPositions[5][2] = -3542;
_karmaPositions[6][0] = -82930;
_karmaPositions[6][1] = 156775;
_karmaPositions[6][2] = -3156;
_karmaPositions[7][0] = 15436;
_karmaPositions[7][1] = 148426;
_karmaPositions[7][2] = -3371;
_karmaPositions[8][0] = 78274;
_karmaPositions[8][1] = 145178;
_karmaPositions[8][2] = -3598;
_karmaPositions[9][0] = 76658;
_karmaPositions[9][1] = 56229;
_karmaPositions[9][2] = -2980;
_karmaPositions[10][0] = 152543;
_karmaPositions[10][1] = 29202;
_karmaPositions[10][2] = -2337;
_karmaPositions[11][0] = 111115;
_karmaPositions[11][1] = 66811;
_karmaPositions[11][2] = -2764;
_karmaPositions[12][0] = 79253;
_karmaPositions[12][1] = 159441;
_karmaPositions[12][2] = -3207;
} }
public int getMapRegion(int posX, int posY) public int getMapRegion(int posX, int posY)
@@ -75,55 +157,28 @@ public class MapRegionTable
return _regions[tileX][tileY]; return _regions[tileX][tileY];
} }
public int[] getClosestTownCords(Creature activeChar) public int[] getClosestTownCords(PlayerInstance player)
{ {
int[][] pos = new int[13][3]; int closest = getMapRegion(player.getX(), player.getY());
pos[0][0] = -84176; int[] closestCords;
pos[0][1] = 243382; if (player.getKarma() > 0)
pos[0][2] = -3126;
pos[1][0] = 45525;
pos[1][1] = 48376;
pos[1][2] = -3059;
pos[2][0] = 12181;
pos[2][1] = 16675;
pos[2][2] = -4580;
pos[3][0] = -45232;
pos[3][1] = -113603;
pos[3][2] = -224;
pos[4][0] = 115074;
pos[4][1] = -178115;
pos[4][2] = -880;
pos[5][0] = -14138;
pos[5][1] = 122042;
pos[5][2] = -2988;
pos[6][0] = -82856;
pos[6][1] = 150901;
pos[6][2] = -3128;
pos[7][0] = 18823;
pos[7][1] = 145048;
pos[7][2] = -3126;
pos[8][0] = 83235;
pos[8][1] = 148497;
pos[8][2] = -3404;
pos[9][0] = 80853;
pos[9][1] = 54653;
pos[9][2] = -1524;
pos[10][0] = 147391;
pos[10][1] = 25967;
pos[10][2] = -2012;
pos[11][0] = 117163;
pos[11][1] = 76511;
pos[11][2] = -2712;
pos[12][0] = 83235;
pos[12][1] = 148497;
pos[12][2] = -3404;
int closest = getMapRegion(activeChar.getX(), activeChar.getY());
int[] ClosestTownCords =
{ {
pos[closest][0], closestCords = new int[]
pos[closest][1], {
pos[closest][2] _karmaPositions[closest][0],
_karmaPositions[closest][1],
_karmaPositions[closest][2]
}; };
return ClosestTownCords; }
else
{
closestCords = new int[]
{
_townPositions[closest][0],
_townPositions[closest][1],
_townPositions[closest][2]
};
}
return closestCords;
} }
} }

View File

@@ -39,6 +39,20 @@ public class DamageSkill implements ISkillHandler
@Override @Override
public void useSkill(PlayerInstance activeChar, Skill skill, WorldObject target) public void useSkill(PlayerInstance activeChar, Skill skill, WorldObject target)
{ {
// PvP flag.
final boolean isEnemy = activeChar.isEnemy(target);
if (isEnemy)
{
if (target.getActingPlayer() != null)
{
activeChar.updatePvPFlag(1);
}
}
else // TODO: Target handlers.
{
return;
}
if (target instanceof Creature) if (target instanceof Creature)
{ {
Creature creature = (Creature) target; Creature creature = (Creature) target;

View File

@@ -17,11 +17,10 @@
*/ */
package org.l2jmobius.gameserver.handler.skillhandlers; package org.l2jmobius.gameserver.handler.skillhandlers;
import java.util.List;
import org.l2jmobius.gameserver.handler.ISkillHandler; import org.l2jmobius.gameserver.handler.ISkillHandler;
import org.l2jmobius.gameserver.model.Skill; import org.l2jmobius.gameserver.model.Skill;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
import org.l2jmobius.gameserver.model.actor.instance.PetInstance; import org.l2jmobius.gameserver.model.actor.instance.PetInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.serverpackets.StatusUpdate; import org.l2jmobius.gameserver.network.serverpackets.StatusUpdate;
@@ -44,6 +43,17 @@ public class HealSkill implements ISkillHandler
@Override @Override
public void useSkill(PlayerInstance activeChar, Skill skill, WorldObject target) public void useSkill(PlayerInstance activeChar, Skill skill, WorldObject target)
{ {
// PvP flag.
if (target instanceof MonsterInstance)
{
activeChar.updatePvPFlag(1);
}
final PlayerInstance enemyPlayer = target.getActingPlayer();
if ((enemyPlayer != null) && ((enemyPlayer.getPvpFlag() > 0) || (enemyPlayer.getKarma() > 0)))
{
activeChar.updatePvPFlag(1);
}
if (skill.getTargetType() == Skill.TARGET_PET) if (skill.getTargetType() == Skill.TARGET_PET)
{ {
PetInstance pet = activeChar.getPet(); PetInstance pet = activeChar.getPet();
@@ -52,10 +62,8 @@ public class HealSkill implements ISkillHandler
} }
else if ((skill.getTargetType() == Skill.TARGET_PARTY) && activeChar.isInParty()) else if ((skill.getTargetType() == Skill.TARGET_PARTY) && activeChar.isInParty())
{ {
List<PlayerInstance> players = activeChar.getParty().getPartyMembers(); for (PlayerInstance player : activeChar.getParty().getPartyMembers())
for (int i = 0; i < players.size(); ++i)
{ {
PlayerInstance player = players.get(i);
double hp = player.getCurrentHp(); double hp = player.getCurrentHp();
player.setCurrentHp(hp += skill.getPower()); player.setCurrentHp(hp += skill.getPower());
StatusUpdate su = new StatusUpdate(player.getObjectId()); StatusUpdate su = new StatusUpdate(player.getObjectId());

View File

@@ -20,7 +20,7 @@ package org.l2jmobius.gameserver.model;
public class CharSelectInfoPackage public class CharSelectInfoPackage
{ {
private String _name; private String _name;
private int _charId = 199546; private int _charId = 0;
private int _exp = 0; private int _exp = 0;
private int _sp = 0; private int _sp = 0;
private int _clanId = 0; private int _clanId = 0;
@@ -37,6 +37,7 @@ public class CharSelectInfoPackage
private int _maxMp = 0; private int _maxMp = 0;
private double _currentMp = 0.0; private double _currentMp = 0.0;
private Inventory _inventory = new Inventory(); private Inventory _inventory = new Inventory();
private int _karma;
public int getCharId() public int getCharId()
{ {
@@ -217,4 +218,14 @@ public class CharSelectInfoPackage
{ {
_sp = sp; _sp = sp;
} }
public int getKarma()
{
return _karma;
}
public void setKarma(int karma)
{
_karma = karma;
}
} }

View File

@@ -125,4 +125,9 @@ public class WorldObject implements Serializable
{ {
return _knownPlayer; return _knownPlayer;
} }
public PlayerInstance getActingPlayer()
{
return null;
}
} }

View File

@@ -172,6 +172,12 @@ public class Attackable extends NpcInstance
stopRandomWalking(); stopRandomWalking();
stopTargetScan(); stopTargetScan();
calculateRewards(attacker); calculateRewards(attacker);
final PlayerInstance killer = attacker.getActingPlayer();
if ((killer != null) && (killer.getKarma() > 0))
{
killer.decreaseKarma();
}
} }
} }
} }

View File

@@ -213,7 +213,7 @@ public class PetInstance extends Creature
_owner = owner; _owner = owner;
} }
public Creature getOwner() public PlayerInstance getOwner()
{ {
return _owner; return _owner;
} }
@@ -608,4 +608,10 @@ public class PetInstance extends Creature
updateKnownCounter = 0; updateKnownCounter = 0;
} }
} }
@Override
public PlayerInstance getActingPlayer()
{
return _owner;
}
} }

View File

@@ -26,6 +26,7 @@ import java.util.TimerTask;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.CharStatsTable; import org.l2jmobius.gameserver.data.CharStatsTable;
import org.l2jmobius.gameserver.data.CharTemplateTable; import org.l2jmobius.gameserver.data.CharTemplateTable;
import org.l2jmobius.gameserver.data.ExperienceTable; import org.l2jmobius.gameserver.data.ExperienceTable;
@@ -79,6 +80,7 @@ import org.l2jmobius.gameserver.templates.Armor;
import org.l2jmobius.gameserver.templates.CharTemplate; import org.l2jmobius.gameserver.templates.CharTemplate;
import org.l2jmobius.gameserver.templates.Item; import org.l2jmobius.gameserver.templates.Item;
import org.l2jmobius.gameserver.templates.Weapon; import org.l2jmobius.gameserver.templates.Weapon;
import org.l2jmobius.util.Rnd;
public class PlayerInstance extends Creature public class PlayerInstance extends Creature
{ {
@@ -96,7 +98,9 @@ public class PlayerInstance extends Creature
private int _karma; private int _karma;
private int _pvpKills; private int _pvpKills;
private int _pkKills; private int _pkKills;
private int _pvpFlag; private int _pvpFlag = 0;
private long _lastPvpTime;
private static Timer _pvpTimer = null;
private int _maxLoad; private int _maxLoad;
private int _race; private int _race;
private int _classId; private int _classId;
@@ -109,7 +113,7 @@ public class PlayerInstance extends Creature
private final Map<Integer, Skill> _skills = new HashMap<>(); private final Map<Integer, Skill> _skills = new HashMap<>();
private Skill _skill; private Skill _skill;
private final Map<Integer, ShortCut> _shortCuts = new TreeMap<>(); private final Map<Integer, ShortCut> _shortCuts = new TreeMap<>();
private int _allyId; private int _allyId = 0;
private TradeList _tradeList; private TradeList _tradeList;
private List<TradeItem> _sellList; private List<TradeItem> _sellList;
private List<TradeItem> _buyList; private List<TradeItem> _buyList;
@@ -120,7 +124,7 @@ public class PlayerInstance extends Creature
private boolean _partyMatchingShowClass; private boolean _partyMatchingShowClass;
private String _partyMatchingMemo; private String _partyMatchingMemo;
private Party _party = null; private Party _party = null;
private int _clanId; private int _clanId = 0;
private Clan _clan; private Clan _clan;
private boolean _clanLeader; private boolean _clanLeader;
private boolean _isInvul = false; private boolean _isInvul = false;
@@ -178,11 +182,6 @@ public class PlayerInstance extends Creature
return skill.getLevel(); return skill.getLevel();
} }
public void setPvpFlag(int pvpFlag)
{
_pvpFlag = pvpFlag;
}
public int getCanCraft() public int getCanCraft()
{ {
return _canCraft; return _canCraft;
@@ -415,6 +414,88 @@ public class PlayerInstance extends Creature
return _pvpFlag; return _pvpFlag;
} }
private void stopPvPFlag()
{
if (_pvpTimer != null)
{
_pvpTimer.cancel();
_pvpTimer = null;
}
updatePvPFlag(0);
}
public void updatePvPFlag(int value)
{
if (_karma > 0)
{
return;
}
if (value == 1)
{
if (_pvpTimer == null)
{
_pvpTimer = new Timer();
_pvpTimer.schedule(new pvpTask(), 1000, 1000);
}
_lastPvpTime = System.currentTimeMillis() + 30000;
}
if (_pvpFlag == value)
{
return;
}
_pvpFlag = value;
final UserInfo userInfo = new UserInfo(this);
sendPacket(userInfo);
broadcastPacket(userInfo);
}
class pvpTask extends TimerTask
{
@Override
public void run()
{
try
{
final long currentTime = System.currentTimeMillis();
if (currentTime > _lastPvpTime)
{
stopPvPFlag();
}
else if (currentTime > (_lastPvpTime - 5000))
{
updatePvPFlag(2);
}
}
catch (Throwable e)
{
}
}
}
public boolean isEnemy(WorldObject target)
{
if ((target == null) || (target == this))
{
return false;
}
final PlayerInstance targetPlayer = target.getActingPlayer();
if ((_party != null) && (_party == targetPlayer.getParty()))
{
return false;
}
if ((_clanId != 0) && (_clanId == targetPlayer.getClanId()))
{
return false;
}
if ((_allyId != 0) && (_allyId == targetPlayer.getAllyId()))
{
return false;
}
return true;
}
public int getClanId() public int getClanId()
{ {
return _clanId; return _clanId;
@@ -552,6 +633,18 @@ public class PlayerInstance extends Creature
@Override @Override
protected void onHitTimer(Creature target, int damage, boolean crit, boolean miss, boolean soulshot) protected void onHitTimer(Creature target, int damage, boolean crit, boolean miss, boolean soulshot)
{ {
final boolean isEnemy = isEnemy(target);
if (isEnemy)
{
if (target.getActingPlayer() != null)
{
updatePvPFlag(1);
}
}
else // TODO: Target handlers.
{
return;
}
super.onHitTimer(target, damage, crit, miss, soulshot); super.onHitTimer(target, damage, crit, miss, soulshot);
} }
@@ -587,13 +680,20 @@ public class PlayerInstance extends Creature
} }
} }
public void sendMessage(String message)
{
SystemMessage sm = new SystemMessage(SystemMessage.S1_S2);
sm.addString(message);
sendPacket(sm);
}
@Override @Override
protected void startCombat() protected void startCombat()
{ {
Creature target = (Creature) getTarget(); Creature target = (Creature) getTarget();
if (target == null) if (target == null)
{ {
_log.warning("failed to start combat without target."); _log.warning("Failed to start combat without target.");
sendPacket(new ActionFailed()); sendPacket(new ActionFailed());
} }
else if (getAttackRange() < getDistance(target.getX(), target.getY())) else if (getAttackRange() < getDistance(target.getX(), target.getY()))
@@ -770,19 +870,25 @@ public class PlayerInstance extends Creature
} }
@Override @Override
public void reduceCurrentHp(int i, Creature attacker) public void reduceCurrentHp(int ammount, Creature attacker)
{ {
if (isInvul()) if (isInvul())
{ {
return; return;
} }
super.reduceCurrentHp(i, attacker);
super.reduceCurrentHp(ammount, attacker);
if (isDead() && (getPet() != null)) if (isDead() && (getPet() != null))
{ {
getPet().unSummon(this); getPet().unSummon(this);
} }
if (attacker != null)
if (attacker == null)
{ {
return;
}
// Damage message.
SystemMessage smsg = new SystemMessage(36); SystemMessage smsg = new SystemMessage(36);
if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance)) if ((attacker instanceof MonsterInstance) || (attacker instanceof NpcInstance))
{ {
@@ -793,9 +899,122 @@ public class PlayerInstance extends Creature
{ {
smsg.addString(attacker.getName()); smsg.addString(attacker.getName());
} }
smsg.addNumber(i); smsg.addNumber(ammount);
sendPacket(smsg); sendPacket(smsg);
if (!isDead())
{
return;
} }
// Calculate Karma lost.
if (getKarma() > 0)
{
for (ItemInstance item : getInventory().getItems())
{
if (Config.KARMA_PROTECTED_ITEMS.contains(item.getItemId()))
{
continue;
}
if (Rnd.get(100) < Config.KARMA_DROP_CHANCE)
{
getInventory().dropItem(item, 1);
}
}
decreaseKarma();
}
// Died from player.
final PlayerInstance killer = attacker.getActingPlayer();
if (killer != null)
{
if ((_pvpFlag == 0) && (_karma == 0))
{
killer.increasePkKillsAndKarma(getLevel());
}
}
}
public void decreaseKarma()
{
float karmaLost = _karma / (getLevel() * 10);
if (karmaLost < 0)
{
karmaLost = 1;
}
karmaLost *= Config.KARMA_LOST_MULTIPLIER;
if (_karma > karmaLost)
{
setKarma(_karma - (int) karmaLost);
}
else
{
setKarma(0);
}
final UserInfo userInfo = new UserInfo(this);
sendPacket(userInfo);
broadcastPacket(userInfo);
}
public void increasePkKillsAndKarma(int level)
{
int newKarma = Config.KARMA_MIN_KARMA;
int pkLevel = getLevel();
final int pkPKCount = getPkKills();
int pkCountMulti = 0;
if (pkPKCount > 0)
{
pkCountMulti = pkPKCount / 2;
}
else
{
pkCountMulti = 1;
}
if (pkCountMulti < 1)
{
pkCountMulti = 1;
}
newKarma *= pkCountMulti;
int lvlDiffMulti = 0;
if (pkLevel > level)
{
lvlDiffMulti = pkLevel / level;
}
else
{
lvlDiffMulti = 1;
}
if (lvlDiffMulti < 1)
{
lvlDiffMulti = 1;
}
newKarma *= lvlDiffMulti;
if (newKarma < Config.KARMA_MIN_KARMA)
{
newKarma = Config.KARMA_MIN_KARMA;
}
if (newKarma > Config.KARMA_MAX_KARMA)
{
newKarma = Config.KARMA_MAX_KARMA;
}
if (_karma > (Integer.MAX_VALUE - newKarma))
{
newKarma = Integer.MAX_VALUE - getKarma();
}
stopPvPFlag();
setPkKills(_pkKills + 1);
setKarma(_karma + newKarma);
final UserInfo userInfo = new UserInfo(this);
sendPacket(userInfo);
broadcastPacket(userInfo);
} }
public void setPartyMatchingAutomaticRegistration(boolean b) public void setPartyMatchingAutomaticRegistration(boolean b)
@@ -1582,4 +1801,10 @@ public class PlayerInstance extends Creature
} }
} }
} }
@Override
public PlayerInstance getActingPlayer()
{
return this;
}
} }

View File

@@ -125,7 +125,6 @@ public class CharacterCreate extends ClientBasePacket
newChar.setRunSpeed(template.getMoveSpd()); newChar.setRunSpeed(template.getMoveSpd());
newChar.setWalkSpeed((int) (template.getMoveSpd() * 0.7)); newChar.setWalkSpeed((int) (template.getMoveSpd() * 0.7));
newChar.setWit(template.getWit()); newChar.setWit(template.getWit());
newChar.setPvpFlag(0);
newChar.addAdena(5000); newChar.addAdena(5000);
newChar.setCanCraft(template.getCanCraft()); newChar.setCanCraft(template.getCanCraft());
newChar.setX(template.getX()); newChar.setX(template.getX());

View File

@@ -21,6 +21,7 @@ import java.io.IOException;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.ClientThread; import org.l2jmobius.gameserver.network.ClientThread;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld; import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
public class Logout extends ClientBasePacket public class Logout extends ClientBasePacket
@@ -30,11 +31,18 @@ public class Logout extends ClientBasePacket
public Logout(byte[] decrypt, ClientThread client) throws IOException public Logout(byte[] decrypt, ClientThread client) throws IOException
{ {
super(decrypt); super(decrypt);
LeaveWorld ql = new LeaveWorld();
client.getConnection().sendPacket(ql);
PlayerInstance player = client.getActiveChar(); PlayerInstance player = client.getActiveChar();
if (player != null) if (player != null)
{ {
if ((player.getPvpFlag() > 0) || player.isInCombat())
{
player.sendMessage("You cannot exit the game while in combat.");
player.sendPacket(new ActionFailed());
return;
}
LeaveWorld ql = new LeaveWorld();
client.getConnection().sendPacket(ql);
player.deleteMe(); player.deleteMe();
client.saveCharToDisk(player); client.saveCharToDisk(player);
} }

View File

@@ -21,6 +21,7 @@ import java.io.IOException;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.ClientThread; import org.l2jmobius.gameserver.network.ClientThread;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.CharSelectInfo; import org.l2jmobius.gameserver.network.serverpackets.CharSelectInfo;
import org.l2jmobius.gameserver.network.serverpackets.RestartResponse; import org.l2jmobius.gameserver.network.serverpackets.RestartResponse;
@@ -31,7 +32,16 @@ public class RequestRestart extends ClientBasePacket
public RequestRestart(byte[] decrypt, ClientThread client) throws IOException public RequestRestart(byte[] decrypt, ClientThread client) throws IOException
{ {
super(decrypt); super(decrypt);
PlayerInstance player = client.getActiveChar(); PlayerInstance player = client.getActiveChar();
if (player != null)
{
if ((player.getPvpFlag() > 0) || player.isInCombat())
{
player.sendMessage("You cannot exit the game while in combat.");
player.sendPacket(new ActionFailed());
return;
}
player.deleteMe(); player.deleteMe();
RestartResponse response = new RestartResponse(); RestartResponse response = new RestartResponse();
client.getConnection().sendPacket(response); client.getConnection().sendPacket(response);
@@ -40,6 +50,7 @@ public class RequestRestart extends ClientBasePacket
CharSelectInfo cl = new CharSelectInfo(client.getLoginName(), client.getSessionId()); CharSelectInfo cl = new CharSelectInfo(client.getLoginName(), client.getSessionId());
client.getConnection().sendPacket(cl); client.getConnection().sendPacket(cl);
} }
}
@Override @Override
public String getType() public String getType()

View File

@@ -17,6 +17,7 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.gameserver.model.Inventory;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
public class CharInfo extends ServerBasePacket public class CharInfo extends ServerBasePacket
@@ -32,7 +33,7 @@ public class CharInfo extends ServerBasePacket
@Override @Override
public byte[] getContent() public byte[] getContent()
{ {
_bao.write(3); writeC(0x03);
writeD(_cha.getX()); writeD(_cha.getX());
writeD(_cha.getY()); writeD(_cha.getY());
writeD(_cha.getZ()); writeD(_cha.getZ());
@@ -43,16 +44,16 @@ public class CharInfo extends ServerBasePacket
writeD(_cha.getSex()); writeD(_cha.getSex());
writeD(_cha.getClassId()); writeD(_cha.getClassId());
writeD(0); writeD(0);
writeD(_cha.getInventory().getPaperdollItemId(6)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
writeD(_cha.getInventory().getPaperdollItemId(7)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(_cha.getInventory().getPaperdollItemId(8)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
writeD(_cha.getInventory().getPaperdollItemId(9)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
writeD(_cha.getInventory().getPaperdollItemId(10)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
writeD(_cha.getInventory().getPaperdollItemId(11)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
writeD(_cha.getInventory().getPaperdollItemId(12)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
writeD(_cha.getInventory().getPaperdollItemId(13)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
writeD(_cha.getInventory().getPaperdollItemId(14)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
writeD(_cha.getInventory().getPaperdollItemId(0)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_UNDER));
writeD(0); writeD(0);
writeD(_cha.getMagicalSpeed()); writeD(_cha.getMagicalSpeed());
writeD(_cha.getPhysicalSpeed()); writeD(_cha.getPhysicalSpeed());

View File

@@ -26,6 +26,7 @@ import java.util.StringTokenizer;
import org.l2jmobius.gameserver.data.ItemTable; import org.l2jmobius.gameserver.data.ItemTable;
import org.l2jmobius.gameserver.model.CharSelectInfoPackage; import org.l2jmobius.gameserver.model.CharSelectInfoPackage;
import org.l2jmobius.gameserver.model.Inventory;
import org.l2jmobius.gameserver.model.actor.instance.ItemInstance; import org.l2jmobius.gameserver.model.actor.instance.ItemInstance;
import org.l2jmobius.gameserver.templates.Item; import org.l2jmobius.gameserver.templates.Item;
@@ -48,31 +49,29 @@ public class CharSelectInfo extends ServerBasePacket
@Override @Override
public byte[] getContent() public byte[] getContent()
{ {
int size = _characterPackage.length; writeC(0x1F);
_bao.write(31); writeD(_characterPackage.length);
writeD(size); for (CharSelectInfoPackage info : _characterPackage)
// long count = 123371L;
for (int i = 0; i < size; ++i)
{ {
CharSelectInfoPackage charInfoPackage = _characterPackage[i]; writeS(info.getName());
writeS(charInfoPackage.getName()); writeD(info.getCharId());
writeD(charInfoPackage.getCharId());
writeS(_loginName); writeS(_loginName);
writeD(_sessionId); writeD(_sessionId);
writeD(charInfoPackage.getClanId()); writeD(info.getClanId());
writeD(0); writeD(0);
writeD(charInfoPackage.getSex()); writeD(info.getSex());
writeD(charInfoPackage.getRace()); writeD(info.getRace());
writeD(charInfoPackage.getClassId()); writeD(info.getClassId());
writeD(1); writeD(1);
writeD(0); writeD(0);
writeD(0); writeD(0);
writeD(0); writeD(0);
writeF(charInfoPackage.getCurrentHp()); writeF(info.getCurrentHp());
writeF(charInfoPackage.getCurrentMp()); writeF(info.getCurrentMp());
writeD(charInfoPackage.getSp()); writeD(info.getSp());
writeD(charInfoPackage.getExp()); writeD(info.getExp());
writeD(charInfoPackage.getLevel()); writeD(info.getLevel());
writeD(info.getKarma());
writeD(0); writeD(0);
writeD(0); writeD(0);
writeD(0); writeD(0);
@@ -83,42 +82,41 @@ public class CharSelectInfo extends ServerBasePacket
writeD(0); writeD(0);
writeD(0); writeD(0);
writeD(0); writeD(0);
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
writeD(info.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LRHAND));
writeD(0); writeD(0);
writeD(charInfoPackage.getInventory().getPaperdollObjectId(2)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(1)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(3)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(5)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(4)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(6)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(7)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(8)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(9)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(10)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(11)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(12)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(13)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
writeD(charInfoPackage.getInventory().getPaperdollObjectId(14)); writeD(info.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
writeD(0); writeD(info.getHairStyle());
writeD(charInfoPackage.getInventory().getPaperdollItemId(2)); writeD(info.getHairColor());
writeD(charInfoPackage.getInventory().getPaperdollItemId(1)); writeD(info.getFace());
writeD(charInfoPackage.getInventory().getPaperdollItemId(3)); writeF(info.getMaxHp());
writeD(charInfoPackage.getInventory().getPaperdollItemId(5)); writeF(info.getMaxMp());
writeD(charInfoPackage.getInventory().getPaperdollItemId(4)); writeD(info.getDeleteTimer());
writeD(charInfoPackage.getInventory().getPaperdollItemId(6));
writeD(charInfoPackage.getInventory().getPaperdollItemId(7));
writeD(charInfoPackage.getInventory().getPaperdollItemId(8));
writeD(charInfoPackage.getInventory().getPaperdollItemId(9));
writeD(charInfoPackage.getInventory().getPaperdollItemId(10));
writeD(charInfoPackage.getInventory().getPaperdollItemId(11));
writeD(charInfoPackage.getInventory().getPaperdollItemId(12));
writeD(charInfoPackage.getInventory().getPaperdollItemId(13));
writeD(charInfoPackage.getInventory().getPaperdollItemId(14));
writeD(charInfoPackage.getHairStyle());
writeD(charInfoPackage.getHairColor());
writeD(charInfoPackage.getFace());
writeF(charInfoPackage.getMaxHp());
writeF(charInfoPackage.getMaxMp());
writeD(charInfoPackage.getDeleteTimer());
} }
return _bao.toByteArray(); return _bao.toByteArray();
} }
@@ -240,7 +238,7 @@ public class CharSelectInfo extends ServerBasePacket
st.nextToken(); st.nextToken();
_charInfopackage.setExp(Integer.parseInt(st.nextToken())); _charInfopackage.setExp(Integer.parseInt(st.nextToken()));
_charInfopackage.setSp(Integer.parseInt(st.nextToken())); _charInfopackage.setSp(Integer.parseInt(st.nextToken()));
st.nextToken(); _charInfopackage.setKarma(Integer.parseInt(st.nextToken()));
st.nextToken(); st.nextToken();
st.nextToken(); st.nextToken();
_charInfopackage.setClanId(Integer.parseInt(st.nextToken())); _charInfopackage.setClanId(Integer.parseInt(st.nextToken()));

View File

@@ -17,6 +17,7 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets; package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.gameserver.model.Inventory;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
public class UserInfo extends ServerBasePacket public class UserInfo extends ServerBasePacket
@@ -32,7 +33,7 @@ public class UserInfo extends ServerBasePacket
@Override @Override
public byte[] getContent() public byte[] getContent()
{ {
_bao.write(4); writeC(0x04);
writeD(_cha.getX()); writeD(_cha.getX());
writeD(_cha.getY()); writeD(_cha.getY());
writeD(_cha.getZ()); writeD(_cha.getZ());
@@ -58,36 +59,39 @@ public class UserInfo extends ServerBasePacket
writeD(_cha.getCurrentLoad()); writeD(_cha.getCurrentLoad());
writeD(_cha.getMaxLoad()); writeD(_cha.getMaxLoad());
writeD(40); writeD(40);
writeD(_cha.getInventory().getPaperdollObjectId(0));
writeD(_cha.getInventory().getPaperdollObjectId(2)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_UNDER));
writeD(_cha.getInventory().getPaperdollObjectId(1)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR));
writeD(_cha.getInventory().getPaperdollObjectId(3)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR));
writeD(_cha.getInventory().getPaperdollObjectId(5)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK));
writeD(_cha.getInventory().getPaperdollObjectId(4)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER));
writeD(_cha.getInventory().getPaperdollObjectId(6)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER));
writeD(_cha.getInventory().getPaperdollObjectId(7)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD));
writeD(_cha.getInventory().getPaperdollObjectId(8)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
writeD(_cha.getInventory().getPaperdollObjectId(9)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND));
writeD(_cha.getInventory().getPaperdollObjectId(10)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES));
writeD(_cha.getInventory().getPaperdollObjectId(11)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST));
writeD(_cha.getInventory().getPaperdollObjectId(12)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS));
writeD(_cha.getInventory().getPaperdollObjectId(13)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET));
writeD(_cha.getInventory().getPaperdollObjectId(14)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
writeD(_cha.getInventory().getPaperdollItemId(0)); writeD(_cha.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LRHAND));
writeD(_cha.getInventory().getPaperdollItemId(2));
writeD(_cha.getInventory().getPaperdollItemId(1)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_UNDER));
writeD(_cha.getInventory().getPaperdollItemId(3)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR));
writeD(_cha.getInventory().getPaperdollItemId(5)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
writeD(_cha.getInventory().getPaperdollItemId(4)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK));
writeD(_cha.getInventory().getPaperdollItemId(6)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
writeD(_cha.getInventory().getPaperdollItemId(7)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
writeD(_cha.getInventory().getPaperdollItemId(8)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
writeD(_cha.getInventory().getPaperdollItemId(9)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(_cha.getInventory().getPaperdollItemId(10)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
writeD(_cha.getInventory().getPaperdollItemId(11)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
writeD(_cha.getInventory().getPaperdollItemId(12)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
writeD(_cha.getInventory().getPaperdollItemId(13)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
writeD(_cha.getInventory().getPaperdollItemId(14)); writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
writeD(_cha.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
writeD(_cha.getPhysicalAttack()); writeD(_cha.getPhysicalAttack());
writeD(_cha.getPhysicalSpeed()); writeD(_cha.getPhysicalSpeed());
writeD(_cha.getPhysicalDefense()); writeD(_cha.getPhysicalDefense());

View File

@@ -140,13 +140,13 @@ public class ClientThread extends Thread
} }
if (lc.isAccountInLoginServer(account)) if (lc.isAccountInLoginServer(account))
{ {
_log.warning("account is in use on Login server (kicking off):" + account); _log.warning("Account is in use on Login server (kicking off):" + account);
lc.getLoginServerConnection(account).close(); lc.getLoginServerConnection(account).close();
lc.removeLoginServerLogin(account); lc.removeLoginServerLogin(account);
} }
if (lc.isAccountInGameServer(account)) if (lc.isAccountInGameServer(account))
{ {
_log.warning("account is in use on Gamea server (kicking off):" + account); _log.warning("Account is in use on Game server (kicking off):" + account);
lc.getClientConnection(account).close(); lc.getClientConnection(account).close();
lc.removeGameServerLogin(account); lc.removeGameServerLogin(account);
} }