From a142e3d3d8c372de91c612948ec5082005087a04 Mon Sep 17 00:00:00 2001 From: wangyuan Date: Mon, 22 Jul 2019 10:16:47 +0800 Subject: [PATCH] fix goods --- .../ljsd/jieling/battle/actor/Creature.java | 82 +++++++++++++++---- .../jieling/battle/actor/EffectBuffer.java | 13 +++ .../com/ljsd/jieling/battle/actor/Life.java | 22 +++-- .../com/ljsd/jieling/battle/actor/Scene.java | 28 +++++-- .../ljsd/jieling/battle/actor/SceneActor.java | 52 ++++++++++-- .../battle/match/BloodyBattleMatchServer.java | 2 +- .../jieling/battle/match/MatchServerice.java | 10 ++- .../ljsd/jieling/battle/room/BeanToProto.java | 9 +- .../jieling/battle/room/SceneManager.java | 23 +++--- .../com/ljsd/jieling/logic/dao/GoodsInfo.java | 8 ++ .../ljsd/jieling/logic/store/StoreLogic.java | 10 ++- .../network/server/ProtocolsManager.java | 9 +- .../java/com/ljsd/jieling/util/CellUtil.java | 4 +- .../java/com/ljsd/jieling/util/ItemUtil.java | 2 + 14 files changed, 217 insertions(+), 57 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/dao/GoodsInfo.java diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Creature.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Creature.java index 960cf61de..2921cf7db 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Creature.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Creature.java @@ -44,12 +44,17 @@ public abstract class Creature extends SceneActor{ setStateType(StateType.MOVEABLE); } + + public void setMineral(int mineral) { + this.mineral = mineral; + } + public void tick(){ move(null); } - public void setMineral(int mineral) { - this.mineral = mineral; + public void addMineral(int mineral) { + this.mineral += mineral; } public void exec(int tyep, Object parm){ @@ -66,10 +71,22 @@ public abstract class Creature extends SceneActor{ @Override public boolean checkCommand(int commandType,Object parm){ + path.clear(); + getScene().processEventUpdate(EventType.SCENEACTORE_UPDATE,getId()); boolean result = super.checkCommand(commandType,parm); if(result){ if(commandType == 1){ - return CellUtil.isContinuous(getPos(), (List) parm); + List pathTmp = (List) parm; + System.out.println("the uid="+getId() + " " + pathTmp); + System.out.println(getPos()); + if(getPos()!=pathTmp.get(0)){ + return false; + } + boolean continuous = CellUtil.isContinuous(getPos(), (List) parm); + if(continuous){ + continuous = canMoveNext(pathTmp.get(1), false); + } + return continuous; } } return result; @@ -78,7 +95,7 @@ public abstract class Creature extends SceneActor{ //用户移动到新位置, 返回下一个点的坐标,用户展示客户端的转向,及模拟移动 public void move(List path){ long timestamp = System.currentTimeMillis(); - checkUpdateBuffer(timestamp); + checkUpdateBuffer(timestamp,path != null); if(getStateType() != StateType.MOVEABLE){ return; } @@ -126,6 +143,9 @@ public abstract class Creature extends SceneActor{ int oldXY=getPos(); int pathSize = path.size(); for(int i=0; i xySet = CellUtil.getSurroundPos(15,15,curPos); + Set xySet = CellUtil.getSurroundPos(15,20,curPos); Map sceneActorMap = scene.getSceneActorMap(); for(SceneActor sceneActor : sceneActorMap.values()){ if(sceneActor == this) { @@ -172,32 +210,46 @@ public abstract class Creature extends SceneActor{ triggerEvent=1; } } - if(type == ActorType.Mineral && !sceneActor.getBufferMap().containsKey(2)){ + if(type == ActorType.Mineral && this.getType() == ActorType.Player && !checkContainBuffer(2)){ if(curPos == sceneActor.getPos()){ triggerEvent=2; - path.clear(); } } if(type == ActorType.Monster || type == ActorType.Player){ if(getStateType()!=StateType.FROZEN &&sceneActor.getStateType()!= StateType.FROZEN&& xySet.contains(sceneActor.getPos())){ triggerEvent=3; setStateType(StateType.FROZEN); - if(type != ActorType.Monster){ - path.clear(); - } } } if(triggerEvent!=0){ int randomResult = MathUtils.randomInt(10) > 5 ?0:1; - EffectBuffer effectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, timestamp + 5000,getId(), sceneActor.getId(), randomResult&1); - EffectBuffer othereffectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, timestamp + 5000,sceneActor.getId(),getId(), randomResult^1); - whenTriggerEvent(effectBuffer,timestamp); - sceneActor.whenTriggerEvent(othereffectBuffer,timestamp); - result = true; + if(this.getType() == ActorType.Player){ + EffectBuffer effectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, timestamp + 6000,getId(), sceneActor.getId(), randomResult&1); + whenTriggerEvent(effectBuffer,timestamp); + result = true; + } + if(sceneActor.getType() == ActorType.Player){ + EffectBuffer othereffectBuffer = new EffectBuffer(getScene().getBufferId(),triggerEvent, timestamp, timestamp + 6000,sceneActor.getId(),getId(), randomResult^1); + sceneActor.whenTriggerEvent(othereffectBuffer,timestamp); + result = true; + } } return result; } + public boolean checkContainBuffer(int type){ + Map bufferMap = this.getBufferMap(); + Iterator> iterator = bufferMap.entrySet().iterator(); + + while (iterator.hasNext()){ + Map.Entry next = iterator.next(); + if(next.getValue().getType() == type){ + return true; + } + } + return false; + } + public void setLife(Life life) { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/EffectBuffer.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/EffectBuffer.java index 59a7eb52b..d6761a665 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/EffectBuffer.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/EffectBuffer.java @@ -66,4 +66,17 @@ public class EffectBuffer { public int getType() { return type; } + + @Override + public String toString() { + return "EffectBuffer{" + + "id=" + id + + ", type=" + type + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", target=" + target + + ", caster=" + caster + + ", values=" + values + + '}'; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Life.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Life.java index ab5dab630..14c0aeace 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Life.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/Life.java @@ -5,28 +5,36 @@ package com.ljsd.jieling.battle.actor; public class Life { - private int curMp; + private int curHp; private int maxMp; public Life(int curMp, int maxMp) { - this.curMp = curMp; + this.curHp = curMp; this.maxMp = maxMp; } - public long reduceHp(int changeValue) { + public int reduceHp(int changeValue) { if (changeValue <= 0) { - return this.curMp; + return this.curHp; } - return this.curMp - changeValue; + if(this.curHp sceneActorMap = new HashMap<>(3); private BlockingUniqueQueue commandBlockingUniqueQueue = new BlockingUniqueQueue<>(); @@ -42,12 +40,16 @@ public class Scene implements Runnable{ public void tick() throws InterruptedException { - for(SceneActor sceneActor : sceneActorMap.values()){ - sceneActor.tick(); + Iterator> iterator = sceneActorMap.entrySet().iterator(); + while (iterator.hasNext()){ + iterator.next().getValue().tick(); } //消息广播 if(msgUpdate){ + for(Integer removeId : builder.getRemoveActorIdList()){ + sceneActorMap.remove(removeId); + } for(SceneActor sceneActor : sceneActorMap.values()){ if(sceneActor.getType() != ActorType.Npc){ if(willUpdateActors.contains(sceneActor.getId())){ @@ -58,7 +60,7 @@ public class Scene implements Runnable{ for(SceneActor sceneActor : sceneActorMap.values()){ if(sceneActor.getType() == ActorType.Player){ ISession sessionByUid = OnlineUserManager.getSessionByUid(sceneActor.getId()); - if(sessionByUid!=null){ + if(sessionByUid!=null && sceneActor.getGameState()==StateType.READYED_STATE){ MessageUtil.sendIndicationMessage(sessionByUid,1, MessageTypeProto.MessageType.SCENE_MSG_UPDATE_INDICATION_VALUE,builder.build(),true); } } @@ -89,7 +91,6 @@ public class Scene implements Runnable{ break; case SCENEACTORE_REMOVE: int deadId = (int) parm; - sceneActorMap.remove(deadId); builder.addRemoveActorId(deadId); break; } @@ -105,7 +106,7 @@ public class Scene implements Runnable{ } tick(); }catch (Exception e){ - + e.printStackTrace(); } } @@ -123,4 +124,13 @@ public class Scene implements Runnable{ public int getBufferId() { return bufferId++; } + + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/SceneActor.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/SceneActor.java index 21b15145d..453332deb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/SceneActor.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/actor/SceneActor.java @@ -3,6 +3,7 @@ package com.ljsd.jieling.battle.actor; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** @@ -11,9 +12,10 @@ import java.util.*; public abstract class SceneActor{ private int id; private int pos; - private Map bufferMap = new HashMap<>(2); + private Map bufferMap = new ConcurrentHashMap<>(2); private Scene scene; private StateType stateType; + private StateType gameState; public Scene getScene() { @@ -26,10 +28,14 @@ public abstract class SceneActor{ public void addOrUpdateBuffer(EffectBuffer effectBuffer){ bufferMap.put(effectBuffer.getId(),effectBuffer); + System.out.println(effectBuffer); if(effectBuffer.getType() == 3){ stateType = StateType.FROZEN; scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId()); } + if(effectBuffer.getType() == 2){ + scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId()); + } scene.processEventUpdate(EventType.BUFFER_UPDATE,effectBuffer); } @@ -37,17 +43,35 @@ public abstract class SceneActor{ return bufferMap; } - public void checkUpdateBuffer(long now){ + public void checkUpdateBuffer(long now,boolean needRemoveDigger){ boolean isUpdate = false; Iterator> iterator = bufferMap.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry next = iterator.next(); EffectBuffer value = next.getValue(); - if(value.getType() == 2 ){ //挖矿 - int times = (int)((now - value.getStartTime()) / 300); + if(value.getType() == 2){ //挖矿 + int times = (int)((now - value.getStartTime()) / 1000); Creature creature = (Creature) this; - creature.setMineral(times*100); - SceneActor sceneActor = scene.getSceneActorMap().get(value.getCaster()); + Creature mineral =(Creature) scene.getSceneActorMap().get(value.getCaster()); + int willDgger = times; + if(willDgger>0&&mineral.getLife().getCurHp()>0) { + int reallyDigger = mineral.getLife().reduceHp(willDgger); + creature.addMineral(reallyDigger); + scene.processEventUpdate(EventType.SCENEACTORE_UPDATE, creature.getId()); + if(mineral.getLife().getCurHp()>0){ + scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,mineral.getId()); + } + value.setStartTime(value.getStartTime() + reallyDigger*1000); + } + if(needRemoveDigger || mineral.getLife().getCurHp()<=0 ){ + iterator.remove(); + if(mineral.getLife().getCurHp()<=0){ + scene.processEventUpdate(EventType.SCENEACTORE_REMOVE,value.getCaster()); + } + System.out.println("remove the digger buffer" + getId()); + scene.processEventUpdate(EventType.BUFFER_REMOVE,value.getId()); + } + continue; } if( now>value.getEndTime() ){ iterator.remove(); @@ -73,6 +97,14 @@ public abstract class SceneActor{ } addOrUpdateBuffer(new EffectBuffer(scene.getBufferId(),4,now,now+5000,this.getId(),0,0)); }else{ + Creature creature = (Creature) scene.getSceneActorMap().get(value.getCaster()); + int mineral = creature.getMineral(); + if(mineral>0){ + creature.setMineral(0); + scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,creature.getId()); + ((Creature)this).addMineral(mineral); + } + stateType = StateType.MOVEABLE; scene.processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId()); } @@ -118,6 +150,14 @@ public abstract class SceneActor{ return true; } + public StateType getGameState() { + return gameState; + } + + public void setGameState(StateType gameState) { + this.gameState = gameState; + } + public abstract ActorType getType(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/match/BloodyBattleMatchServer.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/match/BloodyBattleMatchServer.java index 545da208f..cb9e8f011 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/match/BloodyBattleMatchServer.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/match/BloodyBattleMatchServer.java @@ -14,7 +14,7 @@ public class BloodyBattleMatchServer implements IMatch{ private static Map roomFull = new HashMap<>(); private static Map uidToRommMap = new HashMap<>(); static { - roomFull.put(1,2); + roomFull.put(1,6); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/match/MatchServerice.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/match/MatchServerice.java index f96f1b62f..80a31d8b9 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/match/MatchServerice.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/match/MatchServerice.java @@ -93,13 +93,20 @@ public class MatchServerice { boolean isAllfinsih = true ; for(SceneActor sceneActor : scene.getSceneActorMap().values()){ if(sceneActor.getId() == uid){ - sceneActor.setStateType(StateType.READYED_STATE); + if(sceneActor.getStateType() != StateType.READYED_STATE){ + sceneActor.setStateType(StateType.READYED_STATE); + } + sceneActor.setGameState(StateType.READYED_STATE); } if(sceneActor.getType()== ActorType.Player && sceneActor.getStateType()!=StateType.READYED_STATE){ isAllfinsih = false; } } + if(scene.getState() == 1){ + return; + } + //全部准备好了,准备开始游戏 if(isAllfinsih){ startGame(scene); @@ -115,6 +122,7 @@ public class MatchServerice { MessageUtil.sendRoomStartGameIndication(sceneActor.getId()); } } + scene.setState(1); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/room/BeanToProto.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/room/BeanToProto.java index 783da8af5..e98bbb1c5 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/room/BeanToProto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/room/BeanToProto.java @@ -3,6 +3,7 @@ package com.ljsd.jieling.battle.room; import com.ljsd.jieling.battle.actor.*; import com.ljsd.jieling.protocols.CommonProto; +import java.util.Iterator; import java.util.Map; public class BeanToProto { @@ -22,7 +23,7 @@ public class BeanToProto { public static CommonProto.Creature getCreature(Creature creature){ return CommonProto.Creature.newBuilder() - .setCurHp(creature.getLife().getCurMp()) + .setCurHp(creature.getLife().getCurHp()) .setMaxHp(creature.getLife().getMaxMp()) .setSpeed(creature.getSpeed()) .addAllPath(creature.getPath()) @@ -49,8 +50,10 @@ public class BeanToProto { for(SceneActor sceneActor : sceneActorMap.values()){ builder.addSceneActor(getSceneActor(sceneActor)); Map bufferMap = sceneActor.getBufferMap(); - for(EffectBuffer effectBuffer : bufferMap.values()){ - builder.addActorEffectBufferInfo(getActorEffectBufferInfo(effectBuffer)); + Iterator> iterator = bufferMap.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry next = iterator.next(); + builder.addActorEffectBufferInfo(getActorEffectBufferInfo(next.getValue())); } } return builder.build(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/battle/room/SceneManager.java b/serverlogic/src/main/java/com/ljsd/jieling/battle/room/SceneManager.java index ab13f76de..c8f73dc7f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/battle/room/SceneManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/battle/room/SceneManager.java @@ -5,6 +5,7 @@ import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.protocols.MessageTypeProto; +import com.ljsd.jieling.protocols.SceneFight; import com.ljsd.jieling.util.MathUtils; import com.ljsd.jieling.util.MessageUtil; @@ -20,7 +21,7 @@ public class SceneManager { public static void createScene(Room room){ Scene scene = new Scene(); scene.setMapId(101); - int i = 13; + int i = 6; for(Integer uid : room.fightPlayer){ User user = null; try { @@ -42,13 +43,15 @@ public class SceneManager { SceneMineral sceneMineral = new SceneMineral(); sceneMineral.setId(999); - sceneMineral.setLife(new Life(100000,100000)); + sceneMineral.setPos(256*3+10); + sceneMineral.setLife(new Life(300000,300000)); scene.addScenActor(sceneMineral); SceneMineral sceneMinera2 = new SceneMineral(); - sceneMinera2.setId(999); - sceneMinera2.setLife(new Life(100,100)); + sceneMinera2.setId(1999); + sceneMinera2.setPos(256*5+2); + sceneMinera2.setLife(new Life(5,5)); scene.addScenActor(sceneMinera2); /* SceneMonster sceneMonster = new SceneMonster(); @@ -150,19 +153,19 @@ public class SceneManager { return; } Scene scene = getSceneMap(user.getRoomInfo().getRoomId()); + SceneFight.SceneCommandResponse.Builder builder = SceneFight.SceneCommandResponse.newBuilder().setType(type).setResult(1); if(type == 1){ SceneActor sceneActor = scene.getSceneActorMap().get(session.getUid()); boolean playerACommandAllow = sceneActor.checkCommand(1, parm); if(!playerACommandAllow){ - MessageUtil.sendErrorResponse(session,0,msgId,"wrong path"); - return; - + builder.setResult(0); + }else{ + Command commandA = new Command(1,sceneActor,parm); + scene.addCommand(commandA); } - Command commandA = new Command(1,sceneActor,parm); - scene.addCommand(commandA); } - MessageUtil.sendMessage(session,1,msgId,null,true); + MessageUtil.sendMessage(session,1,msgId,builder.build(),true); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/GoodsInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/GoodsInfo.java new file mode 100644 index 000000000..5ec66bb6e --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/GoodsInfo.java @@ -0,0 +1,8 @@ +package com.ljsd.jieling.logic.dao; + +public class GoodsInfo { + private int goodsId; + private int type; + private int startTime; + private int endTime; +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java index fc34e441b..9a4e66a2d 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/store/StoreLogic.java @@ -218,8 +218,14 @@ public class StoreLogic { MessageUtil.sendErrorResponse(iSession,0,msgId,err); return; } - - CommonProto.Drop.Builder drop = ItemUtil.drop(user, sStoreConfig.getGoods(), BIReason.STORE_BUY_ITEM); + int[][] goods = sStoreConfig.getGoods(); + int length = goods.length; + int[][] dropItems = new int[length][]; + for(int i=0;i path = new ArrayList<>(); - path.add(1547); - path.add(1292); + path.add(2051); + path.add(2307); for(Integer pos : path){ System.out.println(pos +"----------------"); System.out.print(pos2XY(pos)[0] + " "); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java index 5e7bb2807..18a70c0ac 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ItemUtil.java @@ -57,6 +57,8 @@ public class ItemUtil { return dropBuilder; } + + //指定道具掉落(如:邮件,初始化物品) public static CommonProto.Drop.Builder dropMap(User user, Map itemArr,int reason) throws Exception { CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder();