-
Notifications
You must be signed in to change notification settings - Fork 558
/
Copy pathSessionHandler.java
161 lines (142 loc) · 3.7 KB
/
SessionHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package org.menacheri.zombie.game;
import java.util.List;
import org.menacheri.jetserver.app.GameCommandInterpreter;
import org.menacheri.jetserver.app.Session;
import org.menacheri.jetserver.app.impl.InvalidCommandException;
import org.menacheri.jetserver.communication.DeliveryGuaranty.DeliveryGuarantyOptions;
import org.menacheri.jetserver.communication.MessageBuffer;
import org.menacheri.jetserver.communication.NettyMessageBuffer;
import org.menacheri.jetserver.event.Event;
import org.menacheri.jetserver.event.Events;
import org.menacheri.jetserver.event.NetworkEvent;
import org.menacheri.jetserver.event.impl.DefaultSessionEventHandler;
import org.menacheri.zombie.domain.Defender;
import org.menacheri.zombie.domain.IAM;
import org.menacheri.zombie.domain.Zombie;
import org.menacheri.zombie.domain.ZombieCommands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings("rawtypes")
public class SessionHandler extends DefaultSessionEventHandler implements GameCommandInterpreter
{
private static final Logger LOG = LoggerFactory.getLogger(SessionHandler.class);
volatile int cmdCount;
private Defender defender;
private Zombie zombie;
private IAM iam;
public SessionHandler(Session session,Defender defender, Zombie zombie, IAM iam)
{
super(session);
this.defender = defender;
this.zombie = zombie;
this.iam = iam;
}
public void onDataIn(Event event)
{
try
{
interpretCommand(event.getSource());
}
catch (InvalidCommandException e)
{
e.printStackTrace();
LOG.error("{}",e);
}
}
@Override
public void interpretCommand(Object command) throws InvalidCommandException
{
cmdCount++;
int type;
int operation;
boolean isDefaultProtocol = true;
if(command instanceof MessageBuffer) {
MessageBuffer buf = (MessageBuffer) command;
type = buf.readInt();
operation = buf.readInt();
}else{
// websocket
isDefaultProtocol = false;
List<Double> data = (List)command;
type = data.get(0).intValue();
operation = data.get(1).intValue();
}
IAM iam = IAM.getWho(type);
ZombieCommands cmd = ZombieCommands.CommandsEnum.fromInt(operation);
switch (iam)
{
case ZOMBIE:
switch (cmd)
{
case EAT_BRAINS:
//LOG.trace("Interpreted command EAT_BRAINS");
zombie.eatBrains();
break;
case SELECT_TEAM:
LOG.trace("Interpreted command ZOMBIE SELECT_TEAM");
selectTeam(iam);
break;
}
break;
case DEFENDER:
switch (cmd)
{
case SHOT_GUN:
//LOG.trace("Interpreted command SHOT_GUN");
defender.shotgun();
break;
case SELECT_TEAM:
LOG.trace("Interpreted command DEFENDER SELECT_TEAM");
selectTeam(iam);
break;
}
break;
default:
LOG.error("Received invalid command {}",cmd);
throw new InvalidCommandException("Received invalid command" + cmd);
}
if((cmdCount % 10000) == 0)
{
NettyMessageBuffer buffer = new NettyMessageBuffer();
System.out.println("Command No: " + cmdCount);
buffer.writeInt(cmdCount);
// Event tcpEvent = Events.dataOutTcpEvent(buffer);
// getSession().onEvent(tcpEvent);
NetworkEvent udpEvent = null;
if(isDefaultProtocol){
udpEvent = Events.networkEvent(buffer, DeliveryGuarantyOptions.FAST);
}else{
udpEvent = Events.networkEvent(cmdCount);// for websocket protocol.
}
getSession().onEvent(udpEvent);
}
}
public void selectTeam(IAM iam)
{
this.iam = iam;
}
public Defender getDefender()
{
return defender;
}
public void setDefender(Defender defender)
{
this.defender = defender;
}
public Zombie getZombie()
{
return zombie;
}
public void setZombie(Zombie zombie)
{
this.zombie = zombie;
}
public IAM getIam()
{
return iam;
}
public void setIam(IAM iam)
{
this.iam = iam;
}
}