📄 mapfunction.java
字号:
package com.swing.game.crystal.function;
import java.util.*;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import com.swing.game.crystal.CrystalController;
import com.swing.game.crystal.CrystalPlayer;
import com.swing.game.crystal.utils.Maze;
import com.swing.game.crystal.utils.Plat;
import com.swing.game.crystal.utils.Plot;
import com.swing.game.crystal.utils.SingleMap;
import com.swing.game.crystal.utils.Transport;
import com.swing.server.common.GameFunction;
public class MapFunction extends GameFunction {
public static Logger logger = Logger.getLogger(MapFunction.class);
static {
PropertyConfigurator.configure("./cfg/Log4j.properties");
}
public List handleRequest(String player, String message) {
StringBuffer sb = new StringBuffer();
String[] command = message.split(CrystalController.SPLITTER_2);
// CrystalPlayer tt = null;
CrystalPlayer cp = (CrystalPlayer) gc.playersByPlayerId.get(player);
if (command[0].equals("3")) { //get the url of the map
sb.append("m");
int mapCode = cp.level / 10 + 2;
sb
.append(((SingleMap) CrystalController.MapDatas.get(""
+ mapCode)).data);
}
/**
* 切换入迷宫申请 只发一个 2
*/
else if (command.length == 1) {
// 在正常地图里,需要切换到迷宫
// 是否需要删除地图中的人?
if (cp.mapCode < 100) {
// 返回迷宫相关数据
Maze m = CrystalController.Mazes.getMaze();
if (m != null) {
sb.append("c ");
sb.append(m.width);
sb.append(" ");
sb.append(m.height);
sb.append(" ");
sb.append(m.data);
cp.mapCode = cp.mapCode * 100;
}
sb.append("*");
// 通知其他人此人退出地图,同时也移除本人中的其他人
CrystalPlayer other = null;
if (cp.others != null && cp.others.size() != 0) {
sb.append("T ");
for (Iterator iter = gc.playersByPlayerId.values()
.iterator(); iter.hasNext();) {
other = (CrystalPlayer) iter.next();
if (other.mapCode == cp.mapCode
&& (!other.id.equals(cp.id)))
synchronized (cp) {
other.removeUsers(cp);
cp.others.remove(other.id);
sb.append(other.id);
sb.append(" Q|");
}
}
}
if (sb.charAt(sb.length()-1)==' ')
sb.delete(sb.length() - 2, sb.length());
}
// 本身就在迷宫里,要切换到迷宫外面
// 是否需要重新修改地图中的人?
else {
// 本人的位置信息
cp.mapCode /= 100;
sb.append("P ");
sb.append(cp.mapXPosition);
sb.append(" ");
sb.append(cp.mapYPosition);
sb.append("*");
// 其他人的位置信息
CrystalPlayer other = null;
sb.append("T ");
for (Iterator iter = gc.playersByPlayerId.values().iterator(); iter
.hasNext();) {
other = (CrystalPlayer) iter.next();
if (other.mapCode == cp.mapCode
&& (!other.id.equals(cp.id))) {
synchronized (cp) {
other.addUsers(cp);
if (cp.others == null)
cp.others = new HashMap();
cp.others.put(other.id, other);
if (cp.othersData == null)
cp.othersData = new HashMap();
sb.append(other.id);
sb.append(" ");
sb.append(other.kind);
sb.append(" ");
sb.append(other.mapXPosition);
sb.append(" ");
sb.append(other.mapYPosition);
sb.append("|");
}
}
}
if (sb.charAt(sb.length()-1)==' ')
sb.delete(sb.length() - 2, sb.length());
}
} else {
String fromMapID = null;
String toMapID = null;
String x_pos = null;
String y_pos = null;
/**
* 切地图申请(包括传送点ID为-1的登陆特殊情况) 格式: 2`传送点号 下行信息:
* 情节点信息*玩家位置信息*其他人位置信息(先是退出信息, 然后才是进入信息)
*/
if (command.length == 2) {
// 登陆时的特殊情况
if (command[1].equals("-1")) {
fromMapID = "-1";
toMapID = "" + cp.mapCode;
x_pos = "" + cp.mapXPosition;
y_pos = "" + cp.mapYPosition;
}
// 其他切换情况
else {
Transport t = (Transport) CrystalController.TransportMapping
.get(command[1]);
Plat p = null;
String key = null;
for (Iterator iter = t.maps.keySet().iterator(); iter
.hasNext();) {
key = (String) iter.next();
if (!key.equals("" + cp.mapCode)) {
p = (Plat) t.maps.get(key);
break;
}
}
fromMapID = "" + cp.mapCode;
toMapID = p.mapID;
x_pos = p.mapXPosition;
y_pos = p.mapYPosition;
}
}
/**
* 情节点切换位置请求 格式: 2`目的地图号`目的X坐标`目的Y坐标 下行信息
* 情节点信息*玩家位置信息*其他人位置信息(先是退出信息, 然后才是进入信息)
*/
else if (command.length == 4) {
fromMapID = "" + cp.mapCode;
toMapID = "" + command[1];
x_pos = "" + command[2];
y_pos = "" + command[3];
}
// 玩家位置信息
sb.append("P");
sb.append(toMapID);
sb.append(" ");
sb.append(x_pos);
sb.append(" ");
sb.append(y_pos);
sb.append("*");
List l = (List) CrystalController.PlotMapping.get(toMapID);
// 地图中有情节点
if (l != null && l.size() != 0) {
sb.append("p");
for (Iterator iter = l.iterator(); iter.hasNext();) {
Plot p = (Plot) iter.next();
sb.append(p.id);
sb.append(" ");
sb.append(p.x_pos);
sb.append(" ");
sb.append(p.y_pos);
sb.append(" ");
sb.append(p.npc);
sb.append("|");
}
sb.delete(sb.length() - 1, sb.length());
sb.append("*");
}
// 如果用户在同一张图中移动, 就不用知道其他用户信息
if (!fromMapID.equals(toMapID)) {
// 其他用户信息
// T开头
// Q表示退出
// 类型_X坐标_Y坐标 表示进入
// 通知原来地图的用户本用户已经离开
CrystalPlayer other = null;
if (cp.others != null && cp.others.size() != 0) {
sb.append("T ");
for (Iterator iter = gc.playersByPlayerId.values()
.iterator(); iter.hasNext();) {
other = (CrystalPlayer) iter.next();
if (other.mapCode == Integer.parseInt(fromMapID)
&& (!other.id.equals(cp.id)))
synchronized (cp) {
other.removeUsers(cp);
cp.others.remove(other.id);
sb.append(other.id);
sb.append(" Q|");
}
}
}
if (sb.charAt(sb.length()-1)==' ')
sb.delete(sb.length() - 2, sb.length());
// 通知新图中的用户本用户进入
sb.append("T ");
for (Iterator iter = gc.playersByPlayerId.values().iterator(); iter
.hasNext();) {
other = (CrystalPlayer) iter.next();
if (other.mapCode == Integer.parseInt(toMapID)
&& (!other.id.equals(cp.id))) {
synchronized (cp) {
other.addUsers(cp);
if (cp.others == null)
cp.others = new HashMap();
cp.others.put(other.id, other);
if (cp.othersData == null)
cp.othersData = new HashMap();
sb.append(other.id);
sb.append(" ");
sb.append(other.kind);
sb.append(" ");
sb.append(other.mapXPosition);
sb.append(" ");
sb.append(other.mapYPosition);
sb.append("|");
}
}
}
if (sb.charAt(sb.length()-1)==' ')
sb.delete(sb.length() - 2, sb.length());
}
cp.mapCode = Integer.parseInt(toMapID);
cp.mapXPosition = Integer.parseInt(x_pos);
cp.mapYPosition = Integer.parseInt(y_pos);
}
List r = new ArrayList();
r.add(sb.toString());
return r;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -