• SiteAnalyzer, технический и SEO-анализ сайтов

DLC Гильдия воров

  • Автор темы Автор темы Dision
  • Дата начала Дата начала

Dision

Ефрейтор
Команда форума
VIP
Можно переделать по своему вкусу.
Так же не зашла на проекте.
Подойдет для ПВП сервера.

ЯДРО

Код:
/*
 * M.O.G. Devs Team
 * www.mmorpg-onlinegames.ru
 * Teg's {/aiononline, /eveonline}
 *
 * Thieves Guild Service 5.0.6
 */
package com.mog.gameserver.services.dlc.thievesGuild;

import java.sql.Timestamp;
import java.util.concurrent.Future;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mog.gameserver.configs.main.CustomConfig;
import com.mog.gameserver.configs.main.SecurityConfig;
import com.mog.gameserver.dao.PlayerThievesListDAO;
import com.mog.gameserver.model.TaskId;
import com.mog.gameserver.model.actions.PlayerActions;
import com.mog.gameserver.model.gameobjects.player.Player;
import com.mog.gameserver.model.team.legion.Legion;
import com.mog.gameserver.network.aion.serverpackets.SM_CAPTCHA;
import com.mog.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.mog.gameserver.services.LegionService;
import com.mog.gameserver.services.greatinvasion.DateTimeService;
import com.mog.gameserver.utils.MathUtil;
import com.mog.gameserver.utils.PacketSendUtility;
import com.mog.gameserver.utils.ThreadPoolManager;
import com.mog.gameserver.utils.captcha.CAPTCHAUtil;
import com.mog.gameserver.utils.commons.database.dao.DAOManager;

/**
 * @author Dision
 */
public class ThievesGuildService {
	
	private static final Logger log = LoggerFactory.getLogger(ThievesGuildService.class);

	public void onEnterWorld(Player player) {
		if (!CustomConfig.THIEVES_ENABLE)
			return;
		
		try {
			ThievesStatusList thieves = DAOManager.getDAO(PlayerThievesListDAO.class).loadThieves(player.getObjectId());
			if(thieves == null) {
				player.setThieves(new ThievesStatusList(player.getObjectId(), 0, 0, 0l, 0, "Нет", 0, new Timestamp(System.currentTimeMillis())));
				DAOManager.getDAO(PlayerThievesListDAO.class).saveNewThieves(player.getThieves());
			}
			log.info("ThievesGuildService loadThievesStatus try [Player = " + player.getThieves().getPlayerId() + "]");
		}
		catch (Exception ex) {
			log.error("Error in ThievesGuildService.onEnterWorld [Player = " + player.getName() + "]", ex);
		}
	}

	public void thieves(Player player) {
		if (!CustomConfig.THIEVES_ENABLE)
			return;
		
		for (Player target : player.getKnownList().getKnownPlayers().values()) {
			if (!PlayerActions.isAlreadyDead(target) && MathUtil.isIn3dRange(target, player, 2)) {
				if (!player.isThieves())
					player.setIsThieves(true);
				
				player.setCaptchaWord(CAPTCHAUtil.getRandomWord());
				player.setCaptchaImage(CAPTCHAUtil.createCAPTCHA(player.getCaptchaWord()).array());
				captchaCheck(player, target, 0, true, SecurityConfig.CAPTCHA_EXTRACTION_BAN_TIME * 1000L);
			}
		}
	}
	
	public void createRevenge(Player player, Player target) {
		if (!CustomConfig.THIEVES_ENABLE)
			return;
		
		if (player.isThievesDuel())
			return;
		
		target.setThieves(DAOManager.getDAO(PlayerThievesListDAO.class).loadThieves(target.getObjectId()));
		ThievesStatusList thieves = target.getThieves();
		if (thieves.getRevengeName().equals(player.getName()) && !PlayerActions.isAlreadyDead(target) && MathUtil.isIn3dRange(target, player, 2)) {
			player.setThievesDuel(true);
			thievesMessage(player, "Вор " + target.getName() + " в зоне досягаемости. Начинается дуэль.", 0);
			thievesMessage(target, "Жертва " + player.getName() + " в зоне мщения. Начинается дуэль.", 0);
			//DuelService.getInstance().startDuel(player, target);
		}
		log.info("M.O.G. Console: ThievesGuildService createRevenge [Player = " + player.getName() + "]");
	}
	
	public void revenge(Player player, Player target) {
		if (!CustomConfig.THIEVES_ENABLE)
			return;
		
		player.setThieves(DAOManager.getDAO(PlayerThievesListDAO.class).loadThieves(player.getObjectId()));
		target.setThieves(DAOManager.getDAO(PlayerThievesListDAO.class).loadThieves(target.getObjectId()));
		ThievesStatusList thievesPlayer = player.getThieves();
		ThievesStatusList thievesTarget = target.getThieves();
		if (thievesPlayer == null || thievesTarget == null)
			return;
		
		Timestamp nextTime = thievesTarget.getRevengeDate();
		Timestamp currentTime = new Timestamp(System.currentTimeMillis());
		int revengeCount = thievesPlayer.getRevengeCount();
		long kinahResult = (target.getInventory().getKinah() / thievesPlayer.getRankId()) + thievesTarget.getLastThievesKinah();
		if (!player.getName().equals(thievesTarget.getRevengeName()) && currentTime.after(nextTime) && !currentTime.equals(nextTime)) {
			return;
		}
		else {
			player.getInventory().increaseKinah(kinahResult);
			target.getInventory().decreaseKinah(kinahResult);
			thievesPlayer.setRevengeCount(revengeCount + 1);
			thievesMessage(player, "Вы наказали вора " + target.getName() + " и вернули " + kinahResult + " кинар.", 0);
		}
		thievesTarget.setLastThievesKinah(0l);
		thievesTarget.setRevengeName("Нет");
		thievesTarget.setRevengeDate(new Timestamp(System.currentTimeMillis()));
		DAOManager.getDAO(PlayerThievesListDAO.class).storeThieves(thievesPlayer);
		DAOManager.getDAO(PlayerThievesListDAO.class).storeThieves(thievesTarget);
		log.info("M.O.G. Console: ThievesGuildService revenge [Player = " + player.getName() + "]");
	}   
	
	private void thievesIn(Player player) {
		player.setThieves(DAOManager.getDAO(PlayerThievesListDAO.class).loadThieves(player.getObjectId()));
		ThievesStatusList thieves = player.getThieves();
		if (thieves.getRankId() >= 3) {
			for (Legion legion : LegionService.getInstance().getCachedLegions()) {
				if (legion.getLegionName() == "ThievesGuild" && !player.getLegion().getLegionName().equals(legion.getLegionName())) {
					LegionService.getInstance().directAddPlayer(legion, player);
					log.info("M.O.G. Console: ThievesGuildService thievesIn [Player = " + player.getName() + "]");
				}
			}
		}
	}
	
	private void thievesLegionCreate(Player player) {
		for (Legion legion : LegionService.getInstance().getCachedLegions()) {
			if (!legion.getLegionName().contains("ThievesGuild")) {
				LegionService.getInstance().createLegion(player, "ThievesGuild");
				log.info("M.O.G. Console: ThievesGuildService thievesLegionCreate done");
			}
		}
	}
	
	public void captchaCheck(Player player, int captchaCount, boolean state, long delay) {
		captchaCheck(player, null, captchaCount, state, delay);
	}
	
	public void captchaCheck(Player player, Player target, int captchaCount, boolean state, long delay) {
		stopThievesTask(player, false);
		
		if (state) {
			if (captchaCount < 3) {
				PacketSendUtility.sendPacket(player, new SM_CAPTCHA(captchaCount + 1, player.getCaptchaImage()));
			}
			else {
				player.setCaptchaWord(null);
				player.setCaptchaImage(null);
			}
			player.setThievesTimer(delay);
			player.setStopThieves(System.currentTimeMillis());
			scheduleThievesTask(player, delay);
			log.info("M.O.G. Console: ThievesGuildService captchaCheck state [Player = " + player.getName() + "]");
		}
		else {
			PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1400269));
			player.setCaptchaWord(null);
			player.setCaptchaImage(null);
			player.setThievesTimer(0);
			player.setStopThieves(0);
			player.setIsThieves(false);
			// Thieves success
			player.setThieves(DAOManager.getDAO(PlayerThievesListDAO.class).loadThieves(player.getObjectId()));
			ThievesStatusList thieves = player.getThieves();
			Timestamp nextTime = thieves.getRevengeDate();
			Timestamp currentTime = new Timestamp(System.currentTimeMillis());
			int thievesCount = thieves.getThievesCount();
			if (target != null && target.getName().equals(thieves.getRevengeName()) && currentTime.after(nextTime) && !currentTime.equals(nextTime)) {
				long kinah = 0;
				switch (ThievesType.getThievesType(thieves.getRankId())) {
					case SILVER:
						kinah = 1000 * thieves.getRankId();
						break;
					case GOLD:
						kinah = 2000 * thieves.getRankId();
						break;
					case PLATINUM:
						kinah = 3000 * thieves.getRankId();
						break;
					case MITHRIL:
						kinah = 4000 * thieves.getRankId();
						break;
					case SERAMIUM:
						kinah = 5000 * thieves.getRankId();
						break;
					default:
						kinah = 600;
						break;
				}
				int rank = 0;
				switch (thieves.getThievesCount()) {
					case 10:
						rank = 1;
						thievesMessage(player, "Вор", 1);
						break;
					case 50:
						rank = 2;
						thievesMessage(player, "Карманник", 1);
						break;
					case 100:
						rank = 3;
						thievesMessage(player, "Воряга", 1);
						thievesLegionCreate(player);
						thievesIn(player);
						break;
					case 150:
						rank = 4;
						thievesMessage(player, "Ловкие руки", 1);
						break;
					case 200:
						rank = 5;
						thievesMessage(player, "Быстрые руки", 1);
						break;
					case 300:
						rank = 6;
						thievesMessage(player, "Неуловимый", 1);
						break;
				}
				thieves.setRankId(rank);
				thieves.setThievesCount(thievesCount + 1);
				thieves.setRevengeName(target.getName());
				thieves.setRevengeDate(DateTimeService.getInstance().countNextRepeatTimeDay(1));
				thieves.setLastThievesKinah(kinah);
				player.getInventory().increaseKinah(kinah);
				target.getInventory().decreaseKinah(kinah);
				DAOManager.getDAO(PlayerThievesListDAO.class).storeThieves(thieves);
				thievesMessage(player, "Вы обокрали " + target.getName(), 0);
				thievesMessage(player, "Будьте осторожней! Месть может быть быстрой от " + target.getName(), 0);
				thievesMessage(player,  target.getName() + " получил возможность атаковать вас в любое время", 0);
				thievesMessage(player,  "Если " + target.getName() + " вас убьет. Он получит краденое с % а вы потеряете этот %", 0);
				log.info("M.O.G. Console: ThievesGuildService captchaCheck [Player = " + player.getName() + "]");
			}
		}
	}
	
	private void thievesMessage(Player player, String msg, int type) {
		String typeMsg = "";
		switch (type) {
			case 1:
				typeMsg = "Получен новый ранг воровства: ";
				break;
			default:
				break;
		}
		PacketSendUtility.sendMessage(player, "[color:Гильд;0 255 0][color:ия во;0 255 0][color:ров;0 255 0]: " + typeMsg + msg + ".");
	}
	
	private void stopThievesTask(Player player, boolean state) {
		Future<?> thievesTask = player.getController().getTask(TaskId.THIEVES);
		if (thievesTask != null) {
			if (state) {
				long delay = player.getThievesTimer();
				if (delay < 0)
					delay = 0;
				player.setThievesTimer(delay);
			}
			player.getController().cancelTask(TaskId.THIEVES);
		}
	}
	
	private void scheduleThievesTask(final Player player, long thievesTimer) {
		player.setThievesTimer(thievesTimer);
		
		player.getController().addTask(TaskId.THIEVES, ThreadPoolManager.getInstance().schedule(new Runnable() {

			@Override
			public void run() {
				captchaCheck(player, 0, false, 0);
			}
		}, thievesTimer));
	}
	
	public static ThievesGuildService getInstance() {
		return ThievesGuildService.SingletonHolder.instance;
	}

	private static class SingletonHolder {
		protected static final ThievesGuildService instance = new ThievesGuildService();
	}

}

Код:
/*
 * M.O.G. Devs Team
 * www.mmorpg-onlinegames.ru
 * Teg's {/aiononline, /eveonline}
 */
package com.mog.gameserver.services.dlc.thievesGuild;

import java.sql.Timestamp;

/**
 * @author Dision
 */
public class ThievesStatusList {
	
	private int playerId;
	private int rankId;
	private int thievesCount;
	private Long lastThievesKinah;
	private int prisonCount;
	private String revengeName;
	private int revengeCount;
	private Timestamp revengeDate;
	
	public ThievesStatusList() {
	}

	public ThievesStatusList(int playerId, int rankId, int thievesCount, Long lastThievesKinah, int prisonCount, String revengeName, int revengeCount, Timestamp revengeDate) {
		this.playerId = playerId;
		this.rankId = rankId;
		this.thievesCount = thievesCount;
		this.lastThievesKinah = lastThievesKinah;
		this.prisonCount = prisonCount;
		this.revengeName = revengeName;
		this.revengeCount = revengeCount;
		this.revengeDate = revengeDate;
	}

	public int getPlayerId() {
		return playerId;
	}

	public void setPlayerId(int playerId) {
		this.playerId = playerId;
	}

	public int getRankId() {
		return rankId;
	}

	public void setRankId(int rankId) {
		this.rankId = rankId;
	}

	public int getThievesCount() {
		return thievesCount;
	}

	public void setThievesCount(int thievesCount) {
		this.thievesCount = thievesCount;
	}

	public Long getLastThievesKinah() {
		return lastThievesKinah;
	}

	public void setLastThievesKinah(Long lastThievesKinah) {
		this.lastThievesKinah = lastThievesKinah;
	}

	public int getPrisonCount() {
		return prisonCount;
	}

	public void setPrisonCount(int prisonCount) {
		this.prisonCount = prisonCount;
	}

	public String getRevengeName() {
		return revengeName;
	}

	public void setRevengeName(String revengeName) {
		this.revengeName = revengeName;
	}

	public int getRevengeCount() {
		return revengeCount;
	}

	public void setRevengeCount(int revengeCount) {
		this.revengeCount = revengeCount;
	}

	public Timestamp getRevengeDate() {
		return revengeDate;
	}

	public void setRevengeDate(Timestamp revengeDate) {
		this.revengeDate = revengeDate;
	}
	
}

Код:
/*
 * M.O.G. Devs Team
 * www.mmorpg-onlinegames.ru
 * Teg's {/aiononline, /eveonline}
 */
package com.mog.gameserver.services.dlc.thievesGuild;


/**
 * @author M.O.G. Dision
 */
public enum ThievesType {
	
	NONE(0), // Нет
	BRONZE(1),
	SILVER(2),
	GOLD(3),
	PLATINUM(4),
	MITHRIL(5),
	SERAMIUM(6);

	private int id;

	private ThievesType(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}
	
	public static ThievesType getThievesType(int id) {
		for (ThievesType type : values()) {
			if (id == type.getId()) {
				return type;
			}
		}
		return ThievesType.NONE;
	}
	
}

Код:
/*
 * Player Thieves List
 */
package com.mog.gameserver.dao;

import com.mog.gameserver.services.dlc.thievesGuild.ThievesStatusList;
import com.mog.gameserver.utils.commons.database.dao.DAO;

/**
 * @author Dision
 */
public abstract class PlayerThievesListDAO implements DAO {

	@Override
	public final String getClassName() {
		return PlayerThievesListDAO.class.getName();
	}

	public abstract ThievesStatusList loadThieves(int playerId);
	
	public abstract boolean saveNewThieves(ThievesStatusList thieves);

	public abstract void storeThieves(ThievesStatusList thieves);

}

Mysql5

Код:
/*
 * MySQL5PlayerThievesDAO
 */
package mysql5;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mog.gameserver.dao.MySQL5DAOUtils;
import com.mog.gameserver.dao.PlayerThievesListDAO;
import com.mog.gameserver.services.dlc.thievesGuild.ThievesStatusList;
import com.mog.gameserver.utils.commons.database.DB;
import com.mog.gameserver.utils.commons.database.DatabaseFactory;
import com.mog.gameserver.utils.commons.database.IUStH;

/**
 * @author Dision
 */
public class MySQL5PlayerThievesDAO extends PlayerThievesListDAO {
	
	private static final Logger log = LoggerFactory.getLogger(MySQL5PlayerThievesDAO.class);
	private static final String UPDATE_THIEVES_QUERY = "UPDATE player_thieves SET rank=?, thieves_count=?, prison_count=?, last_kinah=?, revenge_name=?, revenge_count=?, revenge_date=? WHERE player_id=?";
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public ThievesStatusList loadThieves(int playerId) {
		ThievesStatusList thieves = null;
		PreparedStatement st = DB.prepareStatement("SELECT * FROM player_thieves WHERE `player_id`=?");
		
		try {
			st.setInt(1, playerId);
			ResultSet rs = st.executeQuery();
			if (rs.next()) {
				thieves = new ThievesStatusList();
				thieves.setPlayerId(playerId);
				thieves.setRankId(rs.getInt("rank"));
				thieves.setThievesCount(rs.getInt("thieves_count"));
				thieves.setPrisonCount(rs.getInt("prison_count"));
				thieves.setLastThievesKinah(rs.getLong("last_kinah"));
				thieves.setRevengeName(rs.getString("revenge_name"));
				thieves.setRevengeCount(rs.getInt("revenge_count"));
				thieves.setRevengeDate(rs.getTimestamp("revenge_date"));
			}
		}
		catch (Exception e) {
			log.error("Error in MySQL5PlayerThievesDAO.loadThieves, playerId: "+playerId, e);
		}
		finally {
			DB.close(st);
		}
		return thieves;
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean saveNewThieves(ThievesStatusList thieves) {
		Connection con = null;
		try {
			con = DatabaseFactory.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO player_thieves (`player_id`, rank, thieves_count, prison_count, last_kinah, `revenge_name`, revenge_count, revenge_date) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
			preparedStatement.setInt(1, thieves.getPlayerId()); // Default
			preparedStatement.setInt(2, thieves.getRankId());
			preparedStatement.setInt(3, thieves.getThievesCount());
			preparedStatement.setInt(4, thieves.getPrisonCount());
			preparedStatement.setLong(5, thieves.getLastThievesKinah());
			preparedStatement.setString(6, thieves.getRevengeName());
			preparedStatement.setInt(7, thieves.getRevengeCount());
			preparedStatement.setTimestamp(8, thieves.getRevengeDate());
			preparedStatement.execute();
			preparedStatement.close();
		}
		catch (Exception e) {
			log.error("Error in MySQL5PlayerThievesDAO.saveNewThieves", e);
			return false;
		}
		finally {
			DatabaseFactory.close(con);
		}
		return true;
	}

	@Override
	public void storeThieves(final ThievesStatusList thieves) {
		DB.insertUpdate(UPDATE_THIEVES_QUERY, new IUStH() {

			@Override
			public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
				stmt.setInt(1, thieves.getRankId());
				stmt.setInt(2, thieves.getThievesCount());
				stmt.setInt(3, thieves.getPrisonCount());
				stmt.setLong(4, thieves.getLastThievesKinah());
				stmt.setString(5, thieves.getRevengeName());
				stmt.setInt(6, thieves.getRevengeCount());
				stmt.setString(7, thieves.getRevengeName());
				stmt.setTimestamp(8, thieves.getRevengeDate());
				stmt.setInt(9, thieves.getPlayerId()); // Default
				stmt.execute();
			}
		});
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean supports(String database, int majorVersion, int minorVersion) {
		return MySQL5DAOUtils.supports(database, majorVersion, minorVersion);
	}
	
}

Sql

Код:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for player_thieves
-- ----------------------------
DROP TABLE IF EXISTS `player_thieves`;
CREATE TABLE `player_thieves` (
  `player_id` int(11) NOT NULL,
  `rank` int(255) NOT NULL DEFAULT '0',
  `thieves_count` int(255) NOT NULL DEFAULT '0',
  `prison_count` int(255) NOT NULL DEFAULT '0',
  `last_kinah` bigint(20) NOT NULL DEFAULT '0',
  `revenge_name` varchar(25) NOT NULL DEFAULT 'Нет',
  `revenge_count` int(255) NOT NULL DEFAULT '0',
  `revenge_date` timestamp NOT NULL DEFAULT '2016-07-30 00:00:00',
  PRIMARY KEY (`player_id`),
  UNIQUE KEY `unique_name` (`player_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
Назад
Сверху