fix goods

back_recharge
wangyuan 2019-07-22 10:16:47 +08:00
parent 5dde031242
commit a142e3d3d8
14 changed files with 217 additions and 57 deletions

View File

@ -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<Integer>) parm);
List<Integer> pathTmp = (List<Integer>) 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<Integer>) 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<Integer> 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<moveDistance && i<pathSize; i++){
if(!canMoveNext(path.get(0),true)){
return getPos();
}
setPos(path.remove(0));
cachePath.push(getPos());
if(checkEventTrigger(timestamp)){
@ -139,6 +159,24 @@ public abstract class Creature extends SceneActor{
return curPos;
}
public boolean canMoveNext(int nextPath,boolean update){
for(SceneActor sceneActor : getScene().getSceneActorMap().values()){
if(sceneActor == this) {
continue;
}
if(sceneActor.getType()!=ActorType.Mineral && sceneActor.getPos() == nextPath){
if(update){
path.clear();
getScene().processEventUpdate(EventType.SCENEACTORE_UPDATE,this.getId());
System.out.println("can not move next" + getId() + " hit the " + sceneActor.getId());
}
return false;
}
}
return true;
}
public void whenTriggerEvent(EffectBuffer effectBuffer,long timestamp){
this.addOrUpdateBuffer(effectBuffer); //战斗buffer
//打断自己行使路线 广播自己状态 位置信息
@ -149,7 +187,7 @@ public abstract class Creature extends SceneActor{
public boolean checkEventTrigger(long timestamp){
Scene scene = getScene();
int curPos = getPos();
Set<Integer> xySet = CellUtil.getSurroundPos(15,15,curPos);
Set<Integer> xySet = CellUtil.getSurroundPos(15,20,curPos);
Map<Integer, SceneActor> 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<Integer, EffectBuffer> bufferMap = this.getBufferMap();
Iterator<Map.Entry<Integer, EffectBuffer>> iterator = bufferMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, EffectBuffer> next = iterator.next();
if(next.getValue().getType() == type){
return true;
}
}
return false;
}
public void setLife(Life life) {

View File

@ -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 +
'}';
}
}

View File

@ -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 <changeValue){
int temp = curHp;
curHp =0;
return temp;
}
this.curHp -= changeValue;
return changeValue;
}
public int getCurMp() {
return curMp;
public int getCurHp() {
return curHp;
}
public int getMaxMp() {
return maxMp;
}
}

View File

@ -10,15 +10,13 @@ import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.SceneFight;
import com.ljsd.jieling.util.MessageUtil;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.*;
public class Scene implements Runnable{
private int bufferId;
private int mapId; //地图id
private int state;
private Map<Integer,SceneActor> sceneActorMap = new HashMap<>(3);
private BlockingUniqueQueue<Command> 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<Map.Entry<Integer, SceneActor>> 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;
}
}

View File

@ -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<Integer,EffectBuffer> bufferMap = new HashMap<>(2);
private Map<Integer,EffectBuffer> 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<Map.Entry<Integer, EffectBuffer>> iterator = bufferMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, EffectBuffer> 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();

View File

@ -14,7 +14,7 @@ public class BloodyBattleMatchServer implements IMatch{
private static Map<Integer,Integer> roomFull = new HashMap<>();
private static Map<Integer,Room> uidToRommMap = new HashMap<>();
static {
roomFull.put(1,2);
roomFull.put(1,6);
}

View File

@ -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);
}
}

View File

@ -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<Integer, EffectBuffer> bufferMap = sceneActor.getBufferMap();
for(EffectBuffer effectBuffer : bufferMap.values()){
builder.addActorEffectBufferInfo(getActorEffectBufferInfo(effectBuffer));
Iterator<Map.Entry<Integer, EffectBuffer>> iterator = bufferMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer, EffectBuffer> next = iterator.next();
builder.addActorEffectBufferInfo(getActorEffectBufferInfo(next.getValue()));
}
}
return builder.build();

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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<length;i++){
dropItems[i]= goods[i];
dropItems[i][1]= goods[i][1]*itemNum;
}
CommonProto.Drop.Builder drop = ItemUtil.drop(user, dropItems, BIReason.STORE_BUY_ITEM);
if(SStoreTypeConfig.getsStoreTypeConfigMap().get(storeId).getStoreType() != StoreType.GIFT_STORE.getType()){
user.getUserMissionManager().onGameEvent(user, GameEvent.BUY_MATERIAL,sStoreConfig.getGoods()[0][0],itemNum);
}

View File

@ -5,6 +5,9 @@ import com.google.protobuf.GeneratedMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.ljsd.GameApplication;
import com.ljsd.common.mogodb.LjsdMongoTemplate;
import com.ljsd.jieling.battle.actor.Scene;
import com.ljsd.jieling.battle.actor.StateType;
import com.ljsd.jieling.battle.room.SceneManager;
import com.ljsd.jieling.config.SGlobalSystemConfig;
import com.ljsd.jieling.core.FunctionIdEnum;
import com.ljsd.jieling.core.HandlerLogicThread;
@ -310,11 +313,15 @@ public class ProtocolsManager implements ProtocolsAbstract {
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
User user = UserManager.getUserInMem(session.getUid());
if(user == null){
return;
}
if(user.getRoomInfo().getRoomId() != -1){
Scene scene = SceneManager.getSceneMap(user.getRoomInfo().getRoomId());
scene.getSceneActorMap().get(user.getId()).setGameState(StateType.UNREADY_STATE);
}
KtEventUtils.onKtEvent(user, ParamEventBean.UserLoginOutEvent,1);
KtEventUtils.onKtEvent(user, ParamEventBean.UserLogin,1);

View File

@ -26,8 +26,8 @@ public class CellUtil {
public static void main(String[] args) {
List<Integer> 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] + " ");

View File

@ -57,6 +57,8 @@ public class ItemUtil {
return dropBuilder;
}
//指定道具掉落(如:邮件,初始化物品)
public static CommonProto.Drop.Builder dropMap(User user, Map<Integer,Integer> itemArr,int reason) throws Exception {
CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder();