package services;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.handler.IBypassHandler;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
public class ColorName implements IBypassHandler {
private static final String[] COMMANDS =
{
"ColorName"
};
@Override
public boolean useBypass(String command, Player player, Creature bypassOrigin) {
player.getAppearance().setNameColor(Config.NAME_COLOR_01);
player.updateUserInfo();
return true;
}
@Override
public String[] getBypassList() {
return COMMANDS;
}
}
statement.setInt(51, getObjectId());
statement.setInt(52, _appearance.getNameColor());
UPDATE characters SET ... name_colors=? WHERE charId=?
Ну как минимум проверить сохраняет ли в бд изменения и подгружает ли их обратно, так же если тесты от админа - может быть на админе сбрасывает цвет после релога на указанный в конфигеПодскажите как правильно реализовать сервис покраски ника.Проблема в том что ник красит но после релога цвет становится по дефолту.
Java:package services; import org.l2jmobius.Config; import org.l2jmobius.gameserver.handler.IBypassHandler; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; public class ColorName implements IBypassHandler { private static final String[] COMMANDS = { "ColorName" }; @Override public boolean useBypass(String command, Player player, Creature bypassOrigin) { player.getAppearance().setNameColor(Config.NAME_COLOR_01); player.updateUserInfo(); return true; } @Override public String[] getBypassList() { return COMMANDS; } }
Тестил на обычном игрокеНу как минимум проверить сохраняет ли в бд изменения и подгружает ли их обратно, так же если тесты от админа - может быть на админе сбрасывает цвет после релога на указанный в конфиге
Тогда копать в сохранение в бд и загрузку из бд этих измененийТестил на обычном игроке
ps.setInt(ИНДЕКС_ПАРАМЕТРА, _appearance.getNameColor());
player.getAppearance().setNameColor(rset.getInt("name_color"));
private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,charId,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,reputation,fame,raidbossPoints,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,title_color,online,clan_privs,wantspeace,base_class,nobless,power_grade,vitality_points,createDate,kills,deaths,name_colors) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,reputation=?,fame=?,raidbossPoints=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,online=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,bookmarkslot=?,vitality_points=?,language=?,faction=?,pccafe_points=?,kills=?,deaths=?,name_colors=? WHERE charId=?";
внес изменения в createDb
private boolean createDb()
{
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(INSERT_CHARACTER))
{
statement.setString(1, _accountName);
statement.setInt(2, getObjectId());
statement.setString(3, getName());
statement.setInt(4, getLevel());
statement.setInt(5, getMaxHp());
statement.setDouble(6, getCurrentHp());
statement.setInt(7, getMaxCp());
statement.setDouble(8, getCurrentCp());
statement.setInt(9, getMaxMp());
statement.setDouble(10, getCurrentMp());
statement.setInt(11, _appearance.getFace());
statement.setInt(12, _appearance.getHairStyle());
statement.setInt(13, _appearance.getHairColor());
statement.setInt(14, _appearance.isFemale() ? 1 : 0);
statement.setLong(15, getExp());
statement.setLong(16, getSp());
statement.setInt(17, getReputation());
statement.setInt(18, _fame);
statement.setInt(19, _raidbossPoints);
statement.setInt(20, _pvpKills);
statement.setInt(21, _pkKills);
statement.setInt(22, getOgClanId());
statement.setInt(23, getRace().ordinal());
statement.setInt(24, getClassId().getId());
statement.setLong(25, _deleteTimer);
statement.setInt(26, hasDwarvenCraft() ? 1 : 0);
statement.setString(27, getTitle());
statement.setInt(28, _appearance.getTitleColor());
statement.setInt(29, isOnlineInt());
statement.setInt(30, _clanPrivileges.getBitmask());
statement.setInt(31, _wantsPeace);
statement.setInt(32, _baseClass);
statement.setInt(33, isNoble() ? 1 : 0);
statement.setLong(34, 0);
statement.setInt(35, PlayerStat.MIN_VITALITY_POINTS);
statement.setDate(36, new Date(_createDate.getTimeInMillis()));
statement.setInt(37, getTotalKills());
statement.setInt(38, getTotalDeaths());
statement.setInt(39, _appearance.getNameColor());
statement.executeUpdate();
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Could not insert char data: " + e.getMessage(), e);
return false;
}
return true;
}
внес изменения в storeCharBase()
private void storeCharBase()
{
// Get the exp, level, and sp of base class to store in base table
final long exp = getStat().getBaseExp();
final int level = getStat().getBaseLevel();
final long sp = getStat().getBaseSp();
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(UPDATE_CHARACTER))
{
statement.setInt(1, level);
statement.setInt(2, getMaxHp());
statement.setDouble(3, getCurrentHp());
statement.setInt(4, getMaxCp());
statement.setDouble(5, getCurrentCp());
statement.setInt(6, getMaxMp());
statement.setDouble(7, getCurrentMp());
statement.setInt(8, _appearance.getFace());
statement.setInt(9, _appearance.getHairStyle());
statement.setInt(10, _appearance.getHairColor());
statement.setInt(11, _appearance.isFemale() ? 1 : 0);
statement.setInt(12, getHeading());
statement.setInt(13, _lastLoc != null ? _lastLoc.getX() : getX());
statement.setInt(14, _lastLoc != null ? _lastLoc.getY() : getY());
statement.setInt(15, _lastLoc != null ? _lastLoc.getZ() : getZ());
statement.setLong(16, exp);
statement.setLong(17, _expBeforeDeath);
statement.setLong(18, sp);
statement.setInt(19, getReputation());
statement.setInt(20, _fame);
statement.setInt(21, _raidbossPoints);
statement.setInt(22, _pvpKills);
statement.setInt(23, _pkKills);
statement.setInt(24, getOgClanId());
statement.setInt(25, getRace().ordinal());
statement.setInt(26, getClassId().getId());
statement.setLong(27, _deleteTimer);
statement.setString(28, getTitle());
statement.setInt(29, _appearance.getTitleColor());
statement.setInt(30, isOnlineInt());
statement.setInt(31, _clanPrivileges.getBitmask());
statement.setInt(32, _wantsPeace);
statement.setInt(33, _baseClass);
long totalOnlineTime = _onlineTime;
if (_onlineBeginTime > 0)
{
totalOnlineTime += (System.currentTimeMillis() - _onlineBeginTime) / 1000;
}
statement.setLong(34, _offlineShopStart > 0 ? _onlineTime : totalOnlineTime);
statement.setInt(35, isNoble() ? 1 : 0);
statement.setInt(36, _powerGrade);
statement.setInt(37, _pledgeType);
statement.setInt(38, _lvlJoinedAcademy);
statement.setLong(39, _apprentice);
statement.setLong(40, _sponsor);
statement.setLong(41, _clanJoinExpiryTime);
statement.setLong(42, _clanCreateExpiryTime);
statement.setString(43, getName());
statement.setInt(44, _bookmarkslot);
statement.setInt(45, getStat().getBaseVitalityPoints());
statement.setString(46, _lang);
int factionId = 0;
if (_isGood)
{
factionId = 1;
}
if (_isEvil)
{
factionId = 2;
}
statement.setInt(47, factionId);
statement.setInt(48, _pcCafePoints);
statement.setInt(49, getTotalKills());
statement.setInt(50, getTotalDeaths());
statement.setInt(51, getObjectId());
statement.setInt(52, _appearance.getNameColor());
statement.execute();
}
catch (Exception e)
{
LOGGER.log(Level.WARNING, "Could not store char base data: " + this + " - " + e.getMessage(), e);
}
}
внес изменения в storeCharBase()
Player restore(int objectId)
private static Player restore(int objectId)
{
Player player = null;
double currentCp = 0;
double currentHp = 0;
double currentMp = 0;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(RESTORE_CHARACTER))
{
// Retrieve the Player from the characters table of the database
// Извлекает игрока из таблицы персонажей базы данных
statement.setInt(1, objectId);
try (ResultSet rset = statement.executeQuery())
{
if (rset.next())
{
final int activeClassId = rset.getInt("classid");
final boolean female = rset.getInt("sex") != Sex.MALE.ordinal();
final PlayerTemplate template = PlayerTemplateData.getInstance().getTemplate(activeClassId);
final PlayerAppearance app = new PlayerAppearance(rset.getByte("face"), rset.getByte("hairColor"), rset.getByte("hairStyle"), female);
player = new Player(objectId, template, rset.getString("account_name"), app);
player.setName(rset.getString("char_name"));
player.setLastAccess(rset.getLong("lastAccess"));
player.getStat().setExp(rset.getLong("exp"));
player.setExpBeforeDeath(rset.getLong("expBeforeDeath"));
player.getStat().setLevel(rset.getInt("level"));
player.getStat().setSp(rset.getLong("sp"));
player.setWantsPeace(rset.getInt("wantspeace"));
player.setHeading(rset.getInt("heading"));
player.setInitialReputation(rset.getInt("reputation"));
player.setFame(rset.getInt("fame"));
player.setRaidbossPoints(rset.getInt("raidbossPoints"));
player.setPvpKills(rset.getInt("pvpkills"));
player.setPkKills(rset.getInt("pkkills"));
player.setOnlineTime(rset.getLong("onlinetime"));
player.setNoble(rset.getInt("nobless") == 1);
final int factionId = rset.getInt("faction");
if (factionId == 1)
{
player.setGood();
}
if (factionId == 2)
{
player.setEvil();
}
player.setClanJoinExpiryTime(rset.getLong("clan_join_expiry_time"));
if (player.getClanJoinExpiryTime() < System.currentTimeMillis())
{
player.setClanJoinExpiryTime(0);
}
player.setClanCreateExpiryTime(rset.getLong("clan_create_expiry_time"));
if (player.getClanCreateExpiryTime() < System.currentTimeMillis())
{
player.setClanCreateExpiryTime(0);
}
player.setPcCafePoints(rset.getInt("pccafe_points"));
final int clanId = rset.getInt("clanid");
player.setPowerGrade(rset.getInt("power_grade"));
player.getStat().setVitalityPoints(rset.getInt("vitality_points"));
player.setPledgeType(rset.getInt("subpledge"));
// player.setApprentice(rset.getInt("apprentice"));
if (clanId > 0)
{
player.setClan(ClanTable.getInstance().getClan(clanId));
}
if (player.getClan() != null)
{
if (player.getClan().getLeaderId() != player.getObjectId())
{
if (player.getPowerGrade() == 0)
{
player.setPowerGrade(5);
}
player.setClanPrivileges(player.getClan().getRankPrivs(player.getPowerGrade()));
}
else
{
player.getClanPrivileges().setAll();
player.setPowerGrade(1);
}
player.setPledgeClass(ClanMember.calculatePledgeClass(player));
}
else
{
if (player.isNoble())
{
player.setPledgeClass(5);
}
if (player.isHero())
{
player.setPledgeClass(8);
}
player.getClanPrivileges().clear();
}
player.setTotalDeaths(rset.getInt("deaths"));
player.setTotalKills(rset.getInt("kills"));
player.setDeleteTimer(rset.getLong("deletetime"));
player.setTitle(rset.getString("title"));
player.setAccessLevel(rset.getInt("accesslevel"), false, false);
final int titleColor = rset.getInt("title_color");
if (titleColor != PlayerAppearance.DEFAULT_TITLE_COLOR)
{
player.getAppearance().setTitleColor(titleColor);
}
final int nameColor = rset.getInt("name_colors");
if (nameColor != PlayerAppearance.DEFAULT_NAME_COLOR)
{
player.getAppearance().setNameColor(nameColor);
}
CREATE TABLE IF NOT EXISTS `characters` (
`account_name` VARCHAR(45) DEFAULT NULL,
`charId` INT UNSIGNED NOT NULL DEFAULT 0,
`char_name` VARCHAR(35) NOT NULL,
`level` TINYINT UNSIGNED DEFAULT NULL,
`maxHp` MEDIUMINT UNSIGNED DEFAULT NULL,
`curHp` MEDIUMINT UNSIGNED DEFAULT NULL,
`maxCp` MEDIUMINT UNSIGNED DEFAULT NULL,
`curCp` MEDIUMINT UNSIGNED DEFAULT NULL,
`maxMp` MEDIUMINT UNSIGNED DEFAULT NULL,
`curMp` MEDIUMINT UNSIGNED DEFAULT NULL,
`face` TINYINT UNSIGNED DEFAULT NULL,
`hairStyle` TINYINT UNSIGNED DEFAULT NULL,
`hairColor` TINYINT UNSIGNED DEFAULT NULL,
`sex` TINYINT UNSIGNED DEFAULT NULL,
`heading` MEDIUMINT DEFAULT NULL,
`x` MEDIUMINT DEFAULT NULL,
`y` MEDIUMINT DEFAULT NULL,
`z` MEDIUMINT DEFAULT NULL,
`exp` BIGINT UNSIGNED DEFAULT 0,
`expBeforeDeath` BIGINT UNSIGNED DEFAULT 0,
`sp` BIGINT(10) UNSIGNED NOT NULL DEFAULT 0,
`reputation` INT DEFAULT NULL,
`fame` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
`raidbossPoints` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
`pvpkills` SMALLINT UNSIGNED DEFAULT NULL,
`pkkills` SMALLINT UNSIGNED DEFAULT NULL,
`clanid` INT UNSIGNED DEFAULT NULL,
`race` TINYINT UNSIGNED DEFAULT NULL,
`classid` TINYINT UNSIGNED DEFAULT NULL,
`base_class` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`transform_id` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
`deletetime` bigint(13) unsigned NOT NULL DEFAULT '0',
`cancraft` TINYINT UNSIGNED DEFAULT NULL,
`title` VARCHAR(21) DEFAULT NULL,
`title_color` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0xECF9A2,
`accesslevel` MEDIUMINT DEFAULT 0,
`online` TINYINT UNSIGNED DEFAULT NULL,
`onlinetime` INT DEFAULT NULL,
`char_slot` TINYINT UNSIGNED DEFAULT NULL,
`lastAccess` bigint(13) unsigned NOT NULL DEFAULT '0',
`clan_privs` INT UNSIGNED DEFAULT 0,
`wantspeace` TINYINT UNSIGNED DEFAULT 0,
`power_grade` TINYINT UNSIGNED DEFAULT NULL,
`nobless` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`subpledge` SMALLINT NOT NULL DEFAULT 0,
`lvl_joined_academy` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`apprentice` INT UNSIGNED NOT NULL DEFAULT 0,
`sponsor` INT UNSIGNED NOT NULL DEFAULT 0,
`clan_join_expiry_time` bigint(13) unsigned NOT NULL DEFAULT '0',
`clan_create_expiry_time` bigint(13) unsigned NOT NULL DEFAULT '0',
`bookmarkslot` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
`vitality_points` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
`createDate` date NOT NULL DEFAULT '2015-01-01',
`language` VARCHAR(2) DEFAULT NULL,
`faction` TINYINT UNSIGNED NOT NULL DEFAULT '0',
`pccafe_points` int(6) NOT NULL DEFAULT '0',
`deaths` SMALLINT NOT NULL DEFAULT '0',
`kills` SMALLINT NOT NULL DEFAULT '0',
`name_colors` INT UNSIGNED DEFAULT 0,
PRIMARY KEY (`charId`),
KEY `account_name` (`account_name`),
KEY `char_name` (`char_name`),
KEY `clanid` (`clanid`),
KEY `online` (`online`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
# Common
CREATE INDEX idx_charId ON characters (charId);
CREATE INDEX idx_char_name ON characters (char_name);
CREATE INDEX idx_account_name ON characters (account_name);
# CharSelectionInfo
CREATE INDEX idx_accountName_createDate ON characters (account_name, createDate);
# TaskBirthday
CREATE INDEX idx_createDate ON characters (createDate);
statement.setInt(51, getObjectId());
statement.setInt(52, _appearance.getNameColor());
UPDATE characters SET ... name_colors=? WHERE charId=?
sammet, стоит обратить внимание на порядок указания значений подготовленного sql-запроса в методе storeCharBase
Java:statement.setInt(51, getObjectId()); statement.setInt(52, _appearance.getNameColor());
Ничего не смущает?)SQL:UPDATE characters SET ... name_colors=? WHERE charId=?
В запросе RESTORE_CHARACTER возможно тоже что-то не так, его не видно в предоставленном огрызке кода
private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE charId=?";
private static Player restore(int objectId)
{
Player player = null;
double currentCp = 0;
double currentHp = 0;
double currentMp = 0;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(RESTORE_CHARACTER))
{
// Retrieve the Player from the characters table of the database
statement.setInt(1, objectId);
try (ResultSet rset = statement.executeQuery())
{
if (rset.next())
{
final int activeClassId = rset.getInt("classid");
final boolean female = rset.getInt("sex") != Sex.MALE.ordinal();
final PlayerTemplate template = PlayerTemplateData.getInstance().getTemplate(activeClassId);
final PlayerAppearance app = new PlayerAppearance(rset.getByte("face"), rset.getByte("hairColor"), rset.getByte("hairStyle"), female);
player = new Player(objectId, template, rset.getString("account_name"), app);
player.setName(rset.getString("char_name"));
player.setLastAccess(rset.getLong("lastAccess"));
player.getStat().setExp(rset.getLong("exp"));
player.setExpBeforeDeath(rset.getLong("expBeforeDeath"));
player.getStat().setLevel(rset.getInt("level"));
player.getStat().setSp(rset.getLong("sp"));
player.setWantsPeace(rset.getInt("wantspeace"));
player.setHeading(rset.getInt("heading"));
player.setInitialReputation(rset.getInt("reputation"));
player.setFame(rset.getInt("fame"));
player.setRaidbossPoints(rset.getInt("raidbossPoints"));
player.setPvpKills(rset.getInt("pvpkills"));
player.setPkKills(rset.getInt("pkkills"));
player.setOnlineTime(rset.getLong("onlinetime"));
player.setNoble(rset.getInt("nobless") == 1);
final int factionId = rset.getInt("faction");
if (factionId == 1)
{
player.setGood();
}
if (factionId == 2)
{
player.setEvil();
}
player.setClanJoinExpiryTime(rset.getLong("clan_join_expiry_time"));
if (player.getClanJoinExpiryTime() < System.currentTimeMillis())
{
player.setClanJoinExpiryTime(0);
}
player.setClanCreateExpiryTime(rset.getLong("clan_create_expiry_time"));
if (player.getClanCreateExpiryTime() < System.currentTimeMillis())
{
player.setClanCreateExpiryTime(0);
}
player.setPcCafePoints(rset.getInt("pccafe_points"));
final int clanId = rset.getInt("clanid");
player.setPowerGrade(rset.getInt("power_grade"));
player.getStat().setVitalityPoints(rset.getInt("vitality_points"));
player.setPledgeType(rset.getInt("subpledge"));
// player.setApprentice(rset.getInt("apprentice"));
if (clanId > 0)
{
player.setClan(ClanTable.getInstance().getClan(clanId));
}
if (player.getClan() != null)
{
if (player.getClan().getLeaderId() != player.getObjectId())
{
if (player.getPowerGrade() == 0)
{
player.setPowerGrade(5);
}
player.setClanPrivileges(player.getClan().getRankPrivs(player.getPowerGrade()));
}
else
{
player.getClanPrivileges().setAll();
player.setPowerGrade(1);
}
player.setPledgeClass(ClanMember.calculatePledgeClass(player));
}
else
{
if (player.isNoble())
{
player.setPledgeClass(5);
}
if (player.isHero())
{
player.setPledgeClass(8);
}
player.getClanPrivileges().clear();
}
player.setTotalDeaths(rset.getInt("deaths"));
player.setTotalKills(rset.getInt("kills"));
player.setDeleteTimer(rset.getLong("deletetime"));
player.setTitle(rset.getString("title"));
player.setAccessLevel(rset.getInt("accesslevel"), false, false);
final int titleColor = rset.getInt("title_color");
if (titleColor != PlayerAppearance.DEFAULT_TITLE_COLOR)
{
player.getAppearance().setTitleColor(titleColor);
}
int nameColor = rset.getInt("name_colors");
if (nameColor != PlayerAppearance.DEFAULT_NAME_COLOR) {
player.getAppearance().setNameColor(nameColor);
}
player.setFistsWeaponItem(player.findFistsWeaponItem(activeClassId));
player.setUptime(System.currentTimeMillis());
currentHp = rset.getDouble("curHp");
currentCp = rset.getDouble("curCp");
currentMp = rset.getDouble("curMp");
sammet, стоит обратить внимание на порядок указания значений подготовленного sql-запроса в методе storeCharBase
Java:statement.setInt(51, getObjectId()); statement.setInt(52, _appearance.getNameColor());
Ничего не смущает?)SQL:UPDATE characters SET ... name_colors=? WHERE charId=?
В запросе RESTORE_CHARACTER возможно тоже что-то не так, его не видно в предоставленном огрызке кода
исходя из sql-запрса, последним нужно указать айди персонажаесли не лень и есть время - разжуй пожалуйста для чайников) что не так
name_colors=? WHERE charId=?
statement.setInt(51, _appearance.getNameColor());
statement.setInt(52, getObjectId());
statement.execute();
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?