|
package server.shops;
import constants.GameConstants;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Connection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.lang.ref.WeakReference;
import client.inventory.Item;
import client.inventory.ItemLoader;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.MapleInventoryType;
import database.DatabaseConnection;
import handling.channel.ChannelServer;
import handling.world.World;
import java.util.ArrayList;
import server.maps.MapleMapObject;
import server.maps.MapleMap;
import server.maps.MapleMapObjectType;
import tools.Pair;
import tools.packet.PlayerShopPacket;
public abstract class AbstractPlayerStore extends MapleMapObject implements IMaplePlayerShop {
protected boolean open = false, available = false;
protected String ownerName, des, pass;
protected int ownerId, owneraccount, itemId, channel, map;
protected AtomicInteger meso = new AtomicInteger(0);
protected WeakReference<MapleCharacter> chrs[];
protected List<String> visitors = new LinkedList<String>();
protected List<BoughtItem> bought = new LinkedList<BoughtItem>();
protected List<MaplePlayerShopItem> items = new LinkedList<MaplePlayerShopItem>();
public AbstractPlayerStore(MapleCharacter owner, int itemId, String desc, String pass, int slots) {
this.setPosition(owner.getTruePosition());
this.ownerName = owner.getName();
this.ownerId = owner.getId();
this.owneraccount = owner.getAccountID();
this.itemId = itemId;
this.des = desc;
this.pass = pass;
this.map = owner.getMapId();
this.channel = owner.getClient().getChannel();
chrs = new WeakReference[slots];
for (int i = 0; i < chrs.length; i++) {
chrs[i] = new WeakReference<MapleCharacter>(null);
}
}
@Override
public int getMaxSize() {
return chrs.length + 1;
}
@Override
public int getSize() {
return getFreeSlot() == -1 ? getMaxSize() : getFreeSlot();
}
@Override
public void broadcastToVisitors(byte[] packet) {
broadcastToVisitors(packet, true);
}
public void broadcastToVisitors(byte[] packet, boolean owner) {
for (WeakReference<MapleCharacter> chr : chrs) {
if (chr != null && chr.get() != null) {
chr.get().getClient().getSession().write(packet);
}
}
if (getShopType() != IMaplePlayerShop.HIRED_MERCHANT && owner && getMCOwner() != null) {
getMCOwner().getClient().getSession().write(packet);
}
}
public void broadcastToVisitors(byte[] packet, int exception) {
for (WeakReference<MapleCharacter> chr : chrs) {
if (chr != null && chr.get() != null && getVisitorSlot(chr.get()) != exception) {
chr.get().getClient().getSession().write(packet);
}
}
if (getShopType() != IMaplePlayerShop.HIRED_MERCHANT && getMCOwner() != null && exception != ownerId) {
getMCOwner().getClient().getSession().write(packet);
}
}
@Override
public int getMeso() {
return meso.get();
}
@Override
public void setMeso(int meso) {
this.meso.set(meso);
}
@Override
public void setOpen(boolean open) {
this.open = open;
}
@Override
public boolean isOpen() {
return open;
}
public boolean saveItems() {
if (getShopType() != IMaplePlayerShop.HIRED_MERCHANT) { //hired merch only
return false;
}
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DatabaseConnection.getConnection();
ps = con.prepareStatement("DELETE FROM hiredmerch WHERE accountid = ? OR characterid = ?");
ps.setInt(1, owneraccount);
ps.setInt(2, ownerId);
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("INSERT INTO hiredmerch (characterid, accountid, Mesos, time) VALUES (?, ?, ?, ?)", DatabaseConnection.RETURN_GENERATED_KEYS);
ps.setInt(1, ownerId);
ps.setInt(2, owneraccount);
ps.setInt(3, meso.get());
ps.setLong(4, System.currentTimeMillis());
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (!rs.next()) {
throw new RuntimeException("Error, adding merchant to DB");
}
final int packageid = rs.getInt(1);
rs.close();
ps.close();
List<Pair<Item, MapleInventoryType>> iters = new ArrayList<Pair<Item, MapleInventoryType>>();
Item item;
for (MaplePlayerShopItem pItems : items) {
if (pItems.item == null || pItems.bundles <= 0) {
continue;
}
if (pItems.item.getQuantity() <= 0 && !GameConstants.isRechargable(pItems.item.getItemId())) {
continue;
}
item = pItems.item.copy();
item.setQuantity((short) (item.getQuantity() * pItems.bundles));
iters.add(new Pair<Item, MapleInventoryType>(item, GameConstants.getInventoryType(item.getItemId())));
}
ItemLoader.HIRED_MERCHANT.saveItems(iters, packageid);
return true;
} catch (SQLException se) {
se.printStackTrace();
} finally {
if (con != null) {
try {
con.close();
} catch (Exception e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (Exception e) {
}
}
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
}
}
}
return false;
}
public MapleCharacter getVisitor(int num) {
return chrs[num].get();
}
@Override
public void update() {
if (isAvailable()) {
if (getShopType() == IMaplePlayerShop.HIRED_MERCHANT) {
getMap().broadcastMessage(PlayerShopPacket.updateHiredMerchant((HiredMerchant) this));
} else if (getMCOwner() != null) {
getMap().broadcastMessage(PlayerShopPacket.sendPlayerShopBox(getMCOwner()));
}
}
}
@Override
public void addVisitor(MapleCharacter visitor) {
int i = getFreeSlot();
if (i > 0) {
if (getShopType() >= 3) {
broadcastToVisitors(PlayerShopPacket.getMiniGameNewVisitor(visitor, i, (MapleMiniGame) this));
} else {
broadcastToVisitors(PlayerShopPacket.shopVisitorAdd(visitor, i));
}
chrs[i - 1] = new WeakReference<MapleCharacter>(visitor);
if (!isOwner(visitor)) {
visitors.add(visitor.getName());
}
if (getItemId() >= 4080000 && getItemId() <= 4080100) {
if (i == 1) {
update();
}
} else {
if (i == 3) {
update();
}
}
}
}
@Override
public void removeVisitor(MapleCharacter visitor, boolean sendPacket) {
final byte slot = getVisitorSlot(visitor);
boolean shouldUpdate = getFreeSlot() == -1;
if (slot > 0) {
if (sendPacket) {
broadcastToVisitors(PlayerShopPacket.shopVisitorLeave(slot), slot);
}
chrs[slot - 1] = new WeakReference<MapleCharacter>(null);
if (shouldUpdate) {
update();
}
}
}
@Override
public byte getVisitorSlot(MapleCharacter visitor) {
for (byte i = 0; i < chrs.length; i++) {
if (chrs[i] != null && chrs[i].get() != null && chrs[i].get().getId() == visitor.getId()) {
return (byte) (i + 1);
}
}
if (visitor.getId() == ownerId) { //can visit own store in merch, otherwise not.
return 0;
}
return -1;
}
@Override
public void removeAllVisitors(int error, int type) {
for (int i = 0; i < chrs.length; i++) {
MapleCharacter visitor = getVisitor(i);
if (visitor != null) {
if (type != -1) {
visitor.getClient().getSession().write(PlayerShopPacket.shopErrorMessage(error, type == -2 ? i + 1 : type));
}
broadcastToVisitors(PlayerShopPacket.shopVisitorLeave(getVisitorSlot(visitor)), getVisitorSlot(visitor));
visitor.setPlayerShop(null);
chrs[i] = new WeakReference<MapleCharacter>(null);
}
}
update();
}
@Override
public String getOwnerName() {
return ownerName;
}
@Override
public int getOwnerId() {
return ownerId;
}
@Override
public int getOwnerAccId() {
return owneraccount;
}
@Override
public String getDescription() {
if (des == null) {
return "";
}
return des;
}
@Override
public List<Pair<Byte, MapleCharacter>> getVisitors() {
List<Pair<Byte, MapleCharacter>> chrz = new LinkedList<Pair<Byte, MapleCharacter>>();
for (byte i = 0; i < chrs.length; i++) { //include owner or no
if (chrs[i] != null && chrs[i].get() != null) {
chrz.add(new Pair<Byte, MapleCharacter>((byte) (i + 1), chrs[i].get()));
}
}
return chrz;
}
@Override
public List<MaplePlayerShopItem> getItems() {
return items;
}
@Override
public void addItem(MaplePlayerShopItem item) {
//System.out.println("Adding item ... 2");
items.add(item);
}
@Override
public boolean removeItem(int item) {
return false;
}
@Override
public void removeFromSlot(int slot) {
items.remove(slot);
}
@Override
public byte getFreeSlot() {
for (byte i = 0; i < chrs.length; i++) {
if (chrs[i] == null || chrs[i].get() == null) {
return (byte) (i + 1);
}
}
return -1;
}
@Override
public int getItemId() {
return itemId;
}
@Override
public boolean isOwner(MapleCharacter chr) {
return chr.getId() == ownerId && chr.getName().equals(ownerName);
}
@Override
public String getPassword() {
if (pass == null) {
return "";
}
return pass;
}
@Override
public void sendDestroyData(MapleClient client) {
}
@Override
public void sendSpawnData(MapleClient client) {
}
@Override
public MapleMapObjectType getType() {
return MapleMapObjectType.SHOP;
}
public MapleCharacter getMCOwnerWorld() {
int ourChannel = World.Find.findChannel(ownerId);
if (ourChannel <= 0) {
return null;
}
return ChannelServer.getInstance(ourChannel).getPlayerStorage().getCharacterById(ownerId);
}
public MapleCharacter getMCOwnerChannel() {
return ChannelServer.getInstance(channel).getPlayerStorage().getCharacterById(ownerId);
}
public MapleCharacter getMCOwner() {
return getMap().getCharacterById(ownerId);
}
public MapleMap getMap() {
return ChannelServer.getInstance(channel).getMapFactory().getMap(map);
}
@Override
public int getGameType() {
if (getShopType() == IMaplePlayerShop.HIRED_MERCHANT) { //hiredmerch
return 5;
} else if (getShopType() == IMaplePlayerShop.PLAYER_SHOP) { //shop lol
return 4;
} else if (getShopType() == IMaplePlayerShop.OMOK) { //omok
return 1;
} else if (getShopType() == IMaplePlayerShop.MATCH_CARD) { //matchcard
return 2;
}
return 0;
}
@Override
public boolean isAvailable() {
return available;
}
@Override
public void setAvailable(boolean b) {
this.available = b;
}
@Override
public List<BoughtItem> getBoughtItems() {
return bought;
}
@Override
public String getMemberNames() {
String ret = "";
for (WeakReference<MapleCharacter> chr : chrs) {
if (chr != null && chr.get() != null) {
ret += chr.get().getName() + ", ";
}
}
return ret;
}
public static final class BoughtItem {
public int id;
public int quantity;
public int totalPrice;
public String buyer;
public BoughtItem(final int id, final int quantity, final int totalPrice, final String buyer) {
this.id = id;
this.quantity = quantity;
this.totalPrice = totalPrice;
this.buyer = buyer;
}
}
}
|
rehab21 님의 최근 댓글
답변 감사드립니다. 말씀처럼 넷빈에 추가를 했어요. 핸들링.로그인.핸들러 는 이미 존재하고 있어서 그 안에 AutoRegister라는 클래스를 생성했고, http://gamezone.one/index.php?mid=board_RYMI94&search_keyword=%EC%98%A4%ED%86%A0%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0&search_target=title_content&document_srl=286894 게시글에 있는 것 처럼 내용 붙혀넣기 하고 public static boolean getAccountExists(String login) { 부분을 public static boolean getAccountExists(String login) throws SQLException { 로 변경했는데요. 일단 해당 코드가 뭔가 잘못된건지.. 아래 그림처럼 hexsha1 부분이 에러가 나서 빌드가 실패하더라구요. 어떻게 해결할 수 있을까요? 2020 06.01 감사합니다. 2018 08.12 감사합니다. 2018 08.12 감사합니다. 2018 08.12 해결완료 2017 04.05