Сообщений: 28
Тем: 6
Зарегистрирован: Jun 2013
Репутация:
14
Всем привет!
Решил стащить с пв систему Skill Of Balance
Все отлично, скиллы выдает в чате пишет когда истекает срок скилла, но после рестарта (какой бы рестарт не делал, уже и пробовал //restart 360, все равно пропадают временные скиллы, в бд значение не меняется и не удаляется!
Мб кто знает в чем может быть проблема?
Сборка Lucera первая.
Вот что я занес в ServerData
Код ServerData.java
public static class DonateSkill
{
public int cls;
public int id;
public int lvl;
public long expire;
public int priceId;
public int priceCount;
public String priceName;
public String icon;
public String info;
public DonateSkill(int cls, int id, int lvl, long expire)
{
this.cls = cls;
this.id = id;
this.lvl = lvl;
this.expire = expire;
}
public DonateSkill(int cls, int id, int lvl, long expire, int priceId, int priceCount, String priceName, String icon, String info) {
this.cls = cls;
this.id = id;
this.lvl = lvl;
this.expire = expire;
this.priceId = priceId;
this.priceCount = priceCount;
this.priceName = priceName;
this.icon = icon;
this.info = info;
}
}
public void addDonateSkill(int charId, int cls, int id, int lvl, long expire) {
DonateSkill ds = new DonateSkill(cls, id, lvl, expire);
if (_cachedSkills.get(Integer.valueOf(charId)) == null) {
FastTable dst = new FastTable();
dst.add(ds);
_cachedSkills.put(Integer.valueOf(charId), dst);
} else {
((FastTable)_cachedSkills.get(Integer.valueOf(charId))).add(ds);
}
Connection con = null;
PreparedStatement st = null;
try {
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("REPLACE INTO `z_donate_skills` (`char_id`, `class_id`, `skill_id`, `skill_lvl`, `expire`) VALUES (?, ?, ?, ?, ?)");
st.setInt(1, charId);
st.setInt(2, cls);
st.setInt(3, id);
st.setInt(4, lvl);
st.setLong(5, expire);
st.execute();
} catch (Exception e) {
_log.error("ServerData [ERROR]: addDonateSkill() ->" + e);
} finally {
try {
con.close();
st.close();
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(ServerData.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Ненависть врага - высшая награда! (с)
Сообщений: 2,228
Тем: 77
Зарегистрирован: Jan 2012
Репутация:
12,733
Может быть включена защита - проверки на "левые" скилы?
Сообщений: 28
Тем: 6
Зарегистрирован: Jun 2013
Репутация:
14
07-05-2013, 08:56 PM
(Сообщение последний раз редактировалось: 07-05-2013, 10:43 PM Injection.)
MrShyr Написал:Может быть включена защита - проверки на "левые" скилы?
А вот это я и не подумал:redlol:... Спасибо Сейчас проверю)
Вообще не должно это мешать т.е я админом проверяю)
Добавлено через 6 минут
Добавил в список исключения для проверки, не помогло
Добавлено через 1 час 47 минут
Из-за этого не может исчезать?
Делалось методом тыка, при покупке скилла в БД нормально заносится всё, делаю релог тоже все отлично,именно после рестарта исчезает.
PHP код: <?php
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("REPLACE INTO `z_donate_skills` (`char_id`, `class_id`, `skill_id`, `skill_lvl`, `expire`) VALUES (?, ?, ?, ?, ?)");
st.setInt(1, charId);
st.setInt(2, cls);
st.setInt(3, id);
st.setInt(4, lvl);
st.setLong(5, expire);
st.execute();
} catch (Exception e) {
_log.error("ServerData [ERROR]: addDonateSkill() ->" + e);
} finally {
try {
con.close();
st.close();
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(ServerData.clas s.getName()).log(Level.SEVERE, null, ex);
}
}
Ненависть врага - высшая награда! (с)
Сообщений: 290
Тем: 23
Зарегистрирован: Aug 2009
Репутация:
116
если защита удаляет скилы, то ето видно в логах, а скилы при старте сервера подгружает ? просто в етом скрипте не видно как скрипт даеть ети самые скилы...
Сообщений: 28
Тем: 6
Зарегистрирован: Jun 2013
Репутация:
14
Это только то, что относится к БД. т.е я думаю косяк именно тут)
еще кстати метод нашел
PHP код: <?php
private void cacheSoldSkills()
{
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
con = L2DatabaseFactory.getInstance().getConnection();
con.setTransactionIsolation(1);
st = con.prepareStatement("DELETE FROM z_donate_skills WHERE expire > ? AND expire < ?");
st.setInt(1, 1);
st.setLong(2, System.currentTimeMillis());
st.execute();
st.close();
FastTable dst = new FastTable();
st = con.prepareStatement("SELECT char_id, class_id, skill_id, skill_lvl, expire FROM `z_donate_skills`");
rs = st.executeQuery();
while (rs.next()) {
int charId = rs.getInt("char_id");
int classId = rs.getInt("class_id");
int skillId = rs.getInt("skill_id");
int skillLvl = rs.getInt("skill_lvl");
long expire = rs.getLong("expire");
DonateSkill ds = new DonateSkill(classId, skillId, skillLvl, expire);
if (_cachedSkills.get(Integer.valueOf(charId)) == null) {
dst.clear();
dst.add(ds);
_cachedSkills.put(Integer.valueOf(charId), dst);
} else {
((FastTable)_cachedSkills.get(Integer.valueOf(charId))).add(ds);
}
}
} catch (Exception e) {
_log.warn("CustomServerData: cacheDonateSkills() error: " + e);
} finally {
try {
con.close();
st.close();
rs.close();
} catch(SQLException e) {
_log.error("AddDonateSkill: ERROR",e);
}
}
}
Ненависть врага - высшая награда! (с)
Сообщений: 527
Тем: 17
Зарегистрирован: Oct 2010
Репутация:
1,919
Injection Написал:А вот это я и не подумал:redlol:... Спасибо Сейчас проверю)
Вообще не должно это мешать т.е я админом проверяю)
Добавлено через 6 минут
Добавил в список исключения для проверки, не помогло
Добавлено через 1 час 47 минут
Из-за этого не может исчезать?
Делалось методом тыка, при покупке скилла в БД нормально заносится всё, делаю релог тоже все отлично,именно после рестарта исчезает.
PHP код: <?php
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("REPLACE INTO `z_donate_skills` (`char_id`, `class_id`, `skill_id`, `skill_lvl`, `expire`) VALUES (?, ?, ?, ?, ?)");
st.setInt(1, charId);
st.setInt(2, cls);
st.setInt(3, id);
st.setInt(4, lvl);
st.setLong(5, expire);
st.execute();
} catch (Exception e) {
_log.error("ServerData [ERROR]: addDonateSkill() ->" + e);
} finally {
try {
con.close();
st.close();
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(ServerData.clas s.getName()).log(Level.SEVERE, null, ex);
}
}
как задается переменная expire, может она делится на 1000? если да то и при DELETE нужно уменьшать на 1000.
Сообщений: 28
Тем: 6
Зарегистрирован: Jun 2013
Репутация:
14
Mifesto Написал:как задается переменная expire, может она делится на 1000? если да то и при DELETE нужно уменьшать на 1000.
Это идет где выдача скиллов, 2 уровня их, - 1 уровень (2 недели) 2 уровень (1 месяц).
PHP код: <?php
long expire = TimeUnit.DAYS.toMillis(15L);
if (period == 2) {
expire *= 2L;
}
Это же код ServerData, где собственно все связанное с бд
PHP код: <?php
public static class DonateSkill
{
public int cls;
public int id;
public int lvl;
public long expire;
public int priceId;
public int priceCount;
public String priceName;
public String icon;
public String info;
public DonateSkill(int cls, int id, int lvl, long expire)
{
this.cls = cls;
this.id = id;
this.lvl = lvl;
this.expire = expire;
}
public DonateSkill(int cls, int id, int lvl, long expire, int priceId, int priceCount, String priceName, String icon, String info) {
this.cls = cls;
this.id = id;
this.lvl = lvl;
this.expire = expire;
this.priceId = priceId;
this.priceCount = priceCount;
this.priceName = priceName;
this.icon = icon;
this.info = info;
}
}
мозг кипит, а сердце просит :redlol:
Ненависть врага - высшая награда! (с)
Сообщений: 527
Тем: 17
Зарегистрирован: Oct 2010
Репутация:
1,919
вот тут и ошибка, нужно делать:
Код: long expire = TimeUnit.DAYS.toMillis(15L);
if (period == 2)
expire *= 2L;
expire += System.currentTimeMillis();
т.е. к этим 15 или 30 дням добавляем текущее время.
П.С. Сложно помочь когда видишь только огрызки.
Сообщений: 28
Тем: 6
Зарегистрирован: Jun 2013
Репутация:
14
Mifesto Написал:вот тут и ошибка, нужно делать:
Код: long expire = TimeUnit.DAYS.toMillis(15L);
if (period == 2)
expire *= 2L;
expire += System.currentTimeMillis();
т.е. к этим 15 или 30 дням добавляем текущее время.
П.С. Сложно помочь когда видишь только огрызки.
Слышал такое) спасибо но не помогло
Выложу полный код, мб кто найдет косяк..
Покупаю скилл,скилл даётся,делаю релог все ок,пишет скилл до: и т.д, все значения в z_donate_skills забрасываются, но после рестрта скилл пропадает, не пишет до какого числа сервис и тд, в бд все сотается так же как и было до рестрта ничего не исчезает и не меняется, в общем как мне кажется и не считывает с БД значения после РРа, если кто допетрит отпишитесь пожалуйста:Olen':
L2DonateInstance
package ru.catssoftware.gameserver.model.actor.instance;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import javolution.text.TextBuilder;
import javolution.util.FastMap;
import javolution.util.FastMap.Entry;
import javolution.util.FastTable;
import ru.catssoftware.Close;
import ru.catssoftware.Config;
import ru.catssoftware.gameserver.datatables.ServerData;
import ru.catssoftware.gameserver.model.L2ItemInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2NpcInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
public class L2DonateInstance extends L2NpcInstance
{
private static final Logger _log = Logger.getLogger(L2DonateInstance.class.getName());
private static final int SOB_COIN = Config.SOB_COIN;
private static final int SOB_PRICE_ONE = Config.SOB_PRICE_ONE;
private static final int SOB_PRICE_TWO = Config.SOB_PRICE_TWO;
private static final String SOB_COIN_NAME = Config.SOB_COIN_NAME;
public static FastMap<Integer, FastTable<ServerData.DonateSkill>> _donateSkills = ServerData._donateSkills;
public L2DonateInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
}
@Override
public void onBypassFeedback(L2PcInstance player, String command)
{
if (command.startsWith("bueSOB")) {
if (Config.SOB_ID == 0) {
player.sendMessage("Ошибка запроса.");
return;
}
int itId = Integer.parseInt(command.substring(6).trim());
if (itId == 0) {
player.sendMessage("Ошибка запроса.");
return;
}
bueSOB(player, itId);
} else {
super.onBypassFeedback(player, command);
System.out.println("erroe 3");
}
}
private void bueSOB(L2PcInstance player, int period)
{
int price = 99999;
switch (period) {
case 1:
price = SOB_PRICE_ONE;
break;
case 2:
price = SOB_PRICE_TWO;
}
L2ItemInstance coins = player.getInventory().getItemByItemId(SOB_COIN);
if ((coins == null) || (coins.getCount() < price)) {
player.sendMessage(new StringBuilder().append("Не достаточно ").append(SOB_COIN_NAME).append(".").toString());
return;
}
int skillId = Config.SOB_ID;
if ((skillId == 0) || (player.getClassId().getId() < 88)) {
player.sendMessage("Только для 3й профы.");
return;
}
if (skillId == 1) {
switch (player.getClassId().getId()) {
case 88:
case 89:
case 92:
case 93:
case 101:
case 102:
case 108:
case 109:
case 113:
case 114:
skillId = 7077;
break;
case 94:
case 95:
case 103:
case 110:
skillId = 7078;
break;
case 96:
case 97:
case 98:
case 100:
case 104:
case 105:
case 107:
case 111:
case 112:
case 115:
case 116:
skillId = 7079;
break;
case 90:
case 91:
case 99:
case 106:
case 117:
case 118:
skillId = 7080;
}
}
if (player.getKnownSkill(skillId) != null) {
player.sendMessage("У вас уже есть Skill OF Balance.");
return;
}
player.destroyItemByItemId("SOB", SOB_COIN, price, player, true);
long expire = TimeUnit.DAYS.toMillis(15L);
if (period == 2)
expire *= 2L;
expire += System.currentTimeMillis();
player.addDonateSkill(player.getClassId().getId(), skillId, period, System.currentTimeMillis() + expire);
player.sendMessage("Куплен Skill Of Balance, перезайдите!");
}
}
ServerData
package ru.catssoftware.gameserver.datatables;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import javolution.util.FastMap;
import javolution.util.FastTable;
import org.apache.log4j.Logger;
import ru.catssoftware.L2DatabaseFactory;
import ru.catssoftware.gameserver.Shutdown;
import ru.catssoftware.util.StatsSet;
public class ServerData {
private static Logger _log = Logger.getLogger(ServerData.class);
private static ServerData _instance = null;
public static FastMap<Integer, FastTable<DonateSkill>> _cachedSkills = new FastMap();
public static FastMap<Integer, FastTable<DonateSkill>> _donateSkills = new FastMap();
public static ServerData getInstance() {
if(_instance==null)
_instance = new ServerData();
return _instance;
}
private StatsSet _serverData = new StatsSet();
public static void init() throws SQLException {
_instance = new ServerData();
_instance.load();
}
private void load() throws SQLException
{
cacheSoldSkills();
}
private ServerData() {
try {
Connection con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement stm = con.prepareStatement("select * from server_data");
ResultSet rs = stm.executeQuery();
while(rs.next()) {
_serverData.set(rs.getString(1), rs.getString(2));
}
rs.close();
stm.close();
con.close();
Shutdown.getInstance().registerShutdownHandler(new Runnable() {
public void run() {
try {
save();
load();
} catch(SQLException e) {
_log.error("AddDonateSkill: ERROR",e);
}
}
});
} catch(SQLException e) {
_log.error("ServerData: Unable to retrive server data, exiting...",e);
System.exit(1);
}
}
public StatsSet getData() {
return _serverData;
}
public void save() {
try {
Connection con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement update = con.prepareStatement("update server_data set valueData=? where valueName=?");
PreparedStatement insert = con.prepareStatement("insert into server_data values(?,?)");
for(String s : _serverData.getSet().keySet()) {
update.setString(2, s);
update.setString(1, _serverData.getString(s));
if(update.executeUpdate()==0) {
insert.setString(1, s);
insert.setString(2, _serverData.getString(s));
insert.execute();
}
}
insert.close();
update.close();
con.close();
} catch(SQLException e) {
_log.error("ServerData: Unable to save server data!",e);
}
}
public FastTable<DonateSkill> getDonateSkills(int charId) {
return (FastTable)_cachedSkills.get(Integer.valueOf(charId));
}
public static class DonateSkill
{
public int cls;
public int id;
public int lvl;
public long expire;
public int priceId;
public int priceCount;
public String priceName;
public String icon;
public String info;
public DonateSkill(int cls, int id, int lvl, long expire)
{
this.cls = cls;
this.id = id;
this.lvl = lvl;
this.expire = expire;
}
public DonateSkill(int cls, int id, int lvl, long expire, int priceId, int priceCount, String priceName, String icon, String info) {
this.cls = cls;
this.id = id;
this.lvl = lvl;
this.expire = expire;
this.priceId = priceId;
this.priceCount = priceCount;
this.priceName = priceName;
this.icon = icon;
this.info = info;
}
}
public void addDonateSkill(int charId, int cls, int id, int lvl, long expire) {
DonateSkill ds = new DonateSkill(cls, id, lvl, expire);
if (_cachedSkills.get(Integer.valueOf(charId)) == null) {
FastTable dst = new FastTable();
dst.add(ds);
_cachedSkills.put(Integer.valueOf(charId), dst);
} else {
((FastTable)_cachedSkills.get(Integer.valueOf(charId))).add(ds);
}
Connection con = null;
PreparedStatement st = null;
try {
con = L2DatabaseFactory.getInstance().getConnection();
st = con.prepareStatement("REPLACE INTO `z_donate_skills` (`char_id`, `class_id`, `skill_id`, `skill_lvl`, `expire`) VALUES (?, ?, ?, ?, ?)");
st.setInt(1, charId);
st.setInt(2, cls);
st.setInt(3, id);
st.setInt(4, lvl);
st.setLong(5, expire);
st.execute();
} catch (Exception e) {
_log.error("ServerData [ERROR]: addDonateSkill() ->" + e);
} finally {
{
try {
con.close();
st.close();
} catch(SQLException e) {
_log.error("AddDonateSkill: ERROR",e);
}
}
}
}
private void cacheSoldSkills()
{
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
con = L2DatabaseFactory.getInstance().getConnection();
con.setTransactionIsolation(1);
st = con.prepareStatement("DELETE FROM z_donate_skills WHERE expire > ? AND expire < ?");
st.setInt(1, 1);
st.setLong(2, System.currentTimeMillis());
st.execute();
st.close();
FastTable dst = new FastTable();
st = con.prepareStatement("SELECT char_id, class_id, skill_id, skill_lvl, expire FROM `z_donate_skills`");
rs = st.executeQuery();
while (rs.next()) {
int charId = rs.getInt("char_id");
int classId = rs.getInt("class_id");
int skillId = rs.getInt("skill_id");
int skillLvl = rs.getInt("skill_lvl");
long expire = rs.getLong("expire");
DonateSkill ds = new DonateSkill(classId, skillId, skillLvl, expire);
if (_cachedSkills.get(Integer.valueOf(charId)) == null) {
dst.clear();
dst.add(ds);
_cachedSkills.put(Integer.valueOf(charId), dst);
} else {
((FastTable)_cachedSkills.get(Integer.valueOf(charId))).add(ds);
}
}
} catch (Exception e) {
_log.warn("CustomServerData: cacheDonateSkills() error: " + e);
} finally {
try {
con.close();
st.close();
rs.close();
} catch(SQLException e) {
_log.error("AddDonateSkill: ERROR",e);
}
}
}
}
L2PcInstance
L2Summon fairy = null;
public L2Summon getFairy()
{
return this.fairy;
}
public void setFairy(L2Summon fairy) {
this.fairy = fairy;
}
public void checkDonateSkills() {
FastTable donSkills = ServerData.getInstance().getDonateSkills(getObjectId());
if ((donSkills == null) || (donSkills.isEmpty())) {
return;
}
int i = 0; for (int n = donSkills.size(); i < n; i++) {
ServerData.DonateSkill di = (ServerData.DonateSkill)donSkills.get(i);
if (di != null)
{
if ((di.cls <= 0) || (di.cls == getClassId().getId()))
{
if ((di.expire <= 0L) || (di.expire >= System.currentTimeMillis()))
{
addSkill(SkillTable.getInstance().getInfo(di.id, di.lvl), false);
if ((di.id == Config.SOB_ID) || ((di.id >= 7077) && (di.id <= 7080))) {
if (di.lvl == 2) {
L2NpcTemplate summonTemplate = NpcTable.getInstance().getTemplate(Config.SOB_NPC);
L2SummonInstance summon = new L2SummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, this, null);
summon.setName(" ");
summon.setTitle(" ");
summon.setExpPenalty(0.0F);
summon.getStat().setExp(ru.catssoftware.gameserver.model.base.Experience.LEVEL[(80 % ru.catssoftware.gameserver.model.base.Experience.LEVEL.length)]);
summon.getMaxMp();
summon.getMaxMp();
summon.setHeading(getHeading());
summon.setRunning();
setFairy(summon);
L2World.getInstance().storeObject(summon);
summon.spawnMe(getX() + 50, getY() + 100, getZ());
summon.setFollowStatus(true);
summon.setShowSummonAnimation(false);
summon.setIsInvul(true);
broadcastUserInfo();
}
sendCritMessage("Skill Of Balance: до " + new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm s").format(new java.util.Date(di.expire)));} }
}
}
}
}
public void addDonateSkill(int cls, int id, int lvl, long expire) { ServerData.getInstance().addDonateSkill(getObjectId(), cls, id, lvl, expire); }
Ненависть врага - высшая награда! (с)
Сообщений: 527
Тем: 17
Зарегистрирован: Oct 2010
Репутация:
1,919
а можно полный L2PcInstance?
|