⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapfunction.java

📁 一套MMORPG手机网络游戏的服务端
💻 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 + -