微信扫一扫 分享朋友圈

已有 579 人浏览分享

[服務器教學] 打工系統

[複製鏈接]

初窺門道

270

威望

888

金錢

333

A幣
主題
40
回帖
34
精華
1
綜合社群主題發文量
0
電玩社群主題發文量
0
娛樂社群主題發文量
0
技術社群主題發文量
40
閱讀權限
20
註冊時間
2021-11-15
  • TA的每日心情
    奮鬥
    2024-1-28 13:17
  • 簽到天數: 1 天

    連續簽到: 1 天

    [LV.1]初來乍到

    chenhui540 發表於  2026-5-1 23:54:21 | 顯示全部樓層 | 閱讀模式
    1.jpg
    2.jpg
    3.jpg
    4.jpg
    5.jpg
    7.jpg
    6.jpg


    源码部分

        public static byte[] getCharList(String secondpw, List<MapleCharacter> chars, int charslots) {
            MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();

            mplew.writeShort(SendPacketOpcode.CHARLIST.getValue());

            mplew.write(0);
            mplew.write(chars.size());
            for (MapleCharacter chr : chars) {
                addCharEntry(mplew, chr, true, false);
                mplew.write(0);//104
            }
            mplew.writeShort(3);
            mplew.writeLong(charslots);
            mplew.writeReversedLong(PacketHelper.getTime(System.currentTimeMillis())); //同步客户端与服务端时间
            mplew.writeInt(0);

            return mplew.getPacket();
        }

    #####################################



        /*
        打工
        */
        public static void addPartTimeJob(MaplePacketLittleEndianWriter mplew, PartTimeJob parttime) {
            mplew.write(parttime.getJob());
            if (parttime.getJob() > 0 && parttime.getJob() <= 5) {
                mplew.writeReversedLong(parttime.getTime());
            } else {
                mplew.writeReversedLong(getTime(-2));
            }
            mplew.writeInt(parttime.getReward());
            mplew.write(parttime.getReward() > 3 ? 1 : 0); // 1 2 3 普通提示 4 5 6 特殊提示
        }

    ##################################################################


        /*
        打工操作
        */
        public static void PartJob(LittleEndianAccessor slea, MapleClient c) {
            if (c.getPlayer() != null || !c.isLoggedIn()) {
                c.getSession().close();
                return;
            }
            final byte mode = slea.readByte();
            final int cid = slea.readInt();
            if (mode == 1) {
                final PartTimeJob partTime = MapleCharacter.getPartTime(cid);
                final byte job = slea.readByte();
                if (job < 0 || job > 5 || partTime.getReward() > 0 || (partTime.getJob() > 0 && partTime.getJob() <= 5)) {
                    c.getSession().close();
                    return;
                }

                partTime.setTime(PacketHelper.getTime(System.currentTimeMillis())); // 写入初始打工时间

                partTime.setJob(job);
                MapleCharacter.removePartTime(cid);
                MapleCharacter.addPartTime(partTime);
                c.getSession().write(MaplePacketCreator.updatePartTimeJob(partTime));
            } else if (mode == 2) {
                final PartTimeJob partTime = MapleCharacter.getPartTime(cid);
                if (partTime.getReward() > 0 || partTime.getJob() < 0 || partTime.getJob() > 5) {
                    c.getSession().close();
                    return;
                }

                long distance = (PacketHelper.getTime(System.currentTimeMillis()) - partTime.getTime()) / (60 * 60 * 10000000L);

                if (distance > 0) {
                    partTime.setReward((int) (distance > 6 ? 6 : distance));
                } else {
                    partTime.setJob((byte) 0);
                    partTime.setReward(0);
                }
                partTime.setTime(PacketHelper.getTime(System.currentTimeMillis()));
                MapleCharacter.removePartTime(cid);
                MapleCharacter.addPartTime(partTime);
                c.getSession().write(MaplePacketCreator.updatePartTimeJob(partTime));
            }
        }
    }

    #########################################################


        /*
        更新打工信息
        */
        public static byte[] updatePartTimeJob(PartTimeJob partTime) {
            MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(21);
            mplew.writeShort(SendPacketOpcode.PART_TIME.getValue());

            mplew.writeInt(partTime.getCharacterId());
            /*
            1 该角色刚刚结束打工\r\n请稍后重新申请。
            2 打工系统错误,\r\n申请无法处理。
            3 打工相关请求失败。\r\n请稍后重新尝试。
            */
            mplew.write(0);
            PacketHelper.addPartTimeJob(mplew, partTime);

            return mplew.getPacket();
        }

    ######################################################


        /*
        清除打工数据
        */
        public static void removePartTime(int cid) {
            Connection con = null;
            PreparedStatement ps = null;
            try {
                con = DatabaseConnection.getConnection();
                ps = con.prepareStatement("DELETE FROM parttime where cid = ?");
                ps.setInt(1, cid);
                ps.executeUpdate();
            } catch (SQLException ex) {
                System.out.println("Failed to remove part time job: " + ex);
            } finally {
                try {
                    if (ps != null) {
                        ps.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace(System.err);
                }
                if (con != null) {
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace(System.err);
                    }
                }
            }
        }

        /*
        写入打工数据
        */
        public static void addPartTime(PartTimeJob partTime) {
            if (partTime.getCharacterId() < 1) {
                return;
            }
            addPartTime(partTime.getCharacterId(), partTime.getJob(), partTime.getTime(), partTime.getReward());
        }

        public static void addPartTime(int cid, byte job, long time, int reward) {
            Connection con = null;
            PreparedStatement ps = null;
            try {
                con = DatabaseConnection.getConnection();
                ps = con.prepareStatement("INSERT INTO parttime (cid, job, time, reward) VALUES (?, ?, ?, ?)");
                ps.setInt(1, cid);
                ps.setByte(2, job);
                ps.setLong(3, time);
                ps.setInt(4, reward);
                ps.execute();
            } catch (SQLException ex) {
                System.out.println("Failed to remove part time job: " + ex);
            } finally {
                try {
                    if (ps != null) {
                        ps.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace(System.err);
                }
                if (con != null) {
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace(System.err);
                    }
                }
            }
        }

        /*
        查询打工数据
        */
        public static PartTimeJob getPartTime(int cid) {
            PartTimeJob partTime = new PartTimeJob(cid);

            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                con = DatabaseConnection.getConnection();
                ps = con.prepareStatement("SELECT * FROM parttime WHERE cid = ?");
                ps.setInt(1, cid);
                rs = ps.executeQuery();
                if (rs.next()) {
                    partTime.setJob(rs.getByte("job"));
                    partTime.setTime(rs.getLong("time"));
                    partTime.setReward(rs.getInt("reward"));
                }
            } catch (SQLException ex) {
                System.out.println("Failed to remove part time job: " + ex);
            } finally {
                try {
                    if (rs != null) {
                        rs.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace(System.err);
                }
                try {
                    if (ps != null) {
                        ps.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace(System.err);
                }
                if (con != null) {
                    try {
                        con.close();
                    } catch (SQLException e) {
                        e.printStackTrace(System.err);
                    }
                }
            }
            return partTime;
        }

    #########################################


    -- ----------------------------
    -- Table structure for `parttime`
    -- ----------------------------
    DROP TABLE IF EXISTS `parttime`;
    CREATE TABLE `parttime` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cid` int(11) NOT NULL,
      `job` tinyint(1) NOT NULL DEFAULT '0',
      `time` bigint(20) NOT NULL DEFAULT '0',
      `reward` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=euckr ROW_FORMAT=DYNAMIC;

    -- ----------------------------
    -- Records of parttime
    -- ----------------------------


    #######################################

    PartTimeJob.rar (402 Bytes, 下載次數: 66)
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    74

    發文

    888

    金錢

    333

    A幣

    ----------榮譽勳章----------

    熱門推薦
    圖文推薦
    • 聯繫我們

    手機版|小黑屋|AICL社群娛樂集團

    GMT+8, 2026-7-22 02:11 , 網路刷新 0.129175 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322