Class World.Alliance

java.lang.Object
handling.world.World.Alliance
Enclosing class:
World

public static class World.Alliance extends Object
公會聯盟子系統:集中保管所有 MapleGuildAlliance 並提供聯盟相關操作與封包廣播。

LinkedHashMap 快取聯盟物件、ReentrantReadWriteLock 保護其讀寫;靜態初始化區塊於類別載入時 由 MapleGuildAlliance.loadAll() 從資料庫載入全部聯盟。多數操作會委派給對應 MapleGuildAlliance, 並透過 sendGuild(byte[], int, int) 對聯盟內各公會廣播封包;部分操作(建立/解散/成員異動)伴隨資料庫寫入與全聯盟封包扇出。

  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static boolean
    addGuildToAlliance(int allianceid, int gid)
    將一個公會加入指定聯盟。
    static void
    allianceChat(int gid, String name, int cid, String msg)
    發送聯盟頻道聊天訊息給聯盟內所有公會成員。
    static boolean
    canInvite(int allianceid)
    判斷指定聯盟是否還能再加入公會(容量未滿)。
    static boolean
    changeAllianceCapacity(int allianceid)
    擴充指定聯盟的公會容量。
    static boolean
    changeAllianceLeader(int allianceid, int cid)
    變更指定聯盟的盟主。
    static boolean
    changeAllianceLeader(int allianceid, int cid, boolean sameGuild)
    變更指定聯盟的盟主,並指明新舊盟主是否同一公會。
    static boolean
    changeAllianceRank(int allianceid, int cid, int change)
    變更聯盟中某成員的階級。
    static boolean
    createAlliance(String alliancename, int cid, int cid2, int gid, int gid2)
    由兩個公會建立一個新聯盟。
    static boolean
    disbandAlliance(int allianceid)
    解散指定聯盟。
    getAlliance(int allianceid)
    取得指定聯盟物件,必要時延遲載入。
    static List<byte[]>
    getAllianceInfo(int allianceid, boolean start)
    取得指定聯盟的資訊封包清單(供客戶端載入聯盟視窗)。
    static int
    getAllianceLeader(int allianceid)
    取得指定聯盟的盟主角色 ID。
    static boolean
    removeGuildFromAlliance(int allianceid, int gid, boolean expelled)
    將一個公會移出指定聯盟(退出或被驅逐)。
    static void
    將所有已載入的聯盟存回資料庫。
    static void
    sendGuild(byte[] packet, int exceptionId, int allianceid)
    對指定聯盟內各公會廣播任意封包,並可排除其中一個公會。
    static void
    sendGuild(int allianceid)
    對指定聯盟內所有公會廣播聯盟更新封包。
    static void
    setNewAlliance(int gid, int allianceid)
    處理某公會新加入聯盟後的狀態同步與封包廣播。
    static void
    setOldAlliance(int gid, boolean expelled, int allianceid)
    處理某公會離開聯盟(或聯盟解散)後的狀態同步與封包廣播。
    static void
    updateAllianceNotice(int allianceid, String notice)
    更新指定聯盟的公告。
    static void
    updateAllianceRanks(int allianceid, String[] ranks)
    更新指定聯盟的階級名稱。

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • Alliance

      public Alliance()
  • Method Details

    • getAlliance

      public static MapleGuildAlliance getAlliance(int allianceid)
      取得指定聯盟物件,必要時延遲載入。

      先於讀鎖下查快取;未命中則升級寫鎖、以 new MapleGuildAlliance(allianceid) 從資料庫載入並放入快取。 載入失敗(ID 不正)時回傳 null

      Parameters:
      allianceid - 聯盟 ID
      Returns:
      對應的 MapleGuildAlliance;載入失敗時為 null
    • getAllianceLeader

      public static int getAllianceLeader(int allianceid)
      取得指定聯盟的盟主角色 ID。
      Parameters:
      allianceid - 聯盟 ID
      Returns:
      盟主角色 ID;聯盟不存在時為 0
    • updateAllianceRanks

      public static void updateAllianceRanks(int allianceid, String[] ranks)
      更新指定聯盟的階級名稱。

      委派給 MapleGuildAlliance.setRank(String[]);聯盟不存在時靜默不做事。

      Parameters:
      allianceid - 聯盟 ID
      ranks - 各階級名稱
    • updateAllianceNotice

      public static void updateAllianceNotice(int allianceid, String notice)
      更新指定聯盟的公告。

      委派給 MapleGuildAlliance.setNotice(String);聯盟不存在時靜默不做事。

      Parameters:
      allianceid - 聯盟 ID
      notice - 新公告內容
    • canInvite

      public static boolean canInvite(int allianceid)
      判斷指定聯盟是否還能再加入公會(容量未滿)。
      Parameters:
      allianceid - 聯盟 ID
      Returns:
      容量大於目前公會數則為 true;聯盟不存在時為 false
    • changeAllianceLeader

      public static boolean changeAllianceLeader(int allianceid, int cid)
      變更指定聯盟的盟主。

      委派給 MapleGuildAlliance.setLeaderId(int)

      Parameters:
      allianceid - 聯盟 ID
      cid - 新盟主角色 ID
      Returns:
      變更成功則為 true;聯盟不存在或委派失敗時為 false
    • changeAllianceLeader

      public static boolean changeAllianceLeader(int allianceid, int cid, boolean sameGuild)
      變更指定聯盟的盟主,並指明新舊盟主是否同一公會。

      委派給 MapleGuildAlliance.setLeaderId(int, boolean)

      Parameters:
      allianceid - 聯盟 ID
      cid - 新盟主角色 ID
      sameGuild - 新舊盟主是否屬於同一公會
      Returns:
      變更成功則為 true;聯盟不存在或委派失敗時為 false
    • changeAllianceRank

      public static boolean changeAllianceRank(int allianceid, int cid, int change)
      變更聯盟中某成員的階級。

      委派給 MapleGuildAlliance.changeAllianceRank(int, int)

      Parameters:
      allianceid - 聯盟 ID
      cid - 目標角色 ID
      change - 階級變更量
      Returns:
      變更成功則為 true;聯盟不存在或委派失敗時為 false
    • changeAllianceCapacity

      public static boolean changeAllianceCapacity(int allianceid)
      擴充指定聯盟的公會容量。

      委派給 MapleGuildAlliance.setCapacity()

      Parameters:
      allianceid - 聯盟 ID
      Returns:
      擴充成功則為 true;聯盟不存在或委派失敗時為 false
    • disbandAlliance

      public static boolean disbandAlliance(int allianceid)
      解散指定聯盟。

      委派給 MapleGuildAlliance.disband()(伴隨資料庫與成員狀態異動)。

      Parameters:
      allianceid - 聯盟 ID
      Returns:
      解散成功則為 true;聯盟不存在或委派失敗時為 false
    • addGuildToAlliance

      public static boolean addGuildToAlliance(int allianceid, int gid)
      將一個公會加入指定聯盟。

      委派給 MapleGuildAlliance.addGuild(int)

      Parameters:
      allianceid - 聯盟 ID
      gid - 欲加入的公會 ID
      Returns:
      加入成功則為 true;聯盟不存在或委派失敗時為 false
    • removeGuildFromAlliance

      public static boolean removeGuildFromAlliance(int allianceid, int gid, boolean expelled)
      將一個公會移出指定聯盟(退出或被驅逐)。

      委派給 MapleGuildAlliance.removeGuild(int, boolean)

      Parameters:
      allianceid - 聯盟 ID
      gid - 欲移除的公會 ID
      expelled - true 表示被驅逐、false 表示主動退出
      Returns:
      移除成功則為 true;聯盟不存在或委派失敗時為 false
    • sendGuild

      public static void sendGuild(int allianceid)
      對指定聯盟內所有公會廣播聯盟更新封包。

      取得聯盟後送出 getAllianceUpdategetGuildAlliance 兩個 AlliancePacket 封包(不排除任何公會); 聯盟不存在時不做事。具跨頻道封包送出副作用。

      Parameters:
      allianceid - 聯盟 ID
    • sendGuild

      public static void sendGuild(byte[] packet, int exceptionId, int allianceid)
      對指定聯盟內各公會廣播任意封包,並可排除其中一個公會。

      逐一取出聯盟成員公會,對每個有效且不等於 exceptionId 的公會呼叫 World.Guild.guildPacket(int, byte[]); 為其他 sendGuildcreateAlliance 等聯盟廣播的底層。具跨頻道封包送出副作用。

      Parameters:
      packet - 已組好的封包位元組
      exceptionId - 要排除的公會 ID(無排除時傳 -1
      allianceid - 聯盟 ID
    • createAlliance

      public static boolean createAlliance(String alliancename, int cid, int cid2, int gid, int gid2)
      由兩個公會建立一個新聯盟。

      先以 MapleGuildAlliance.createToDb(int, String, int, int) 在資料庫建立聯盟取得新 ID;失敗則回傳 false。 成功後設定兩公會的聯盟 ID、調整其聯盟階級(gid 為主公會),再對聯盟全體廣播一系列 AlliancePacket 初始化封包。具資料庫寫入與跨頻道封包扇出副作用。

      Parameters:
      alliancename - 聯盟名稱
      cid - 發起者(盟主)角色 ID
      cid2 - 另一公會代表角色 ID
      gid - 主公會 ID
      gid2 - 次公會 ID
      Returns:
      建立成功則為 true;資料庫建立失敗時為 false
    • allianceChat

      public static void allianceChat(int gid, String name, int cid, String msg)
      發送聯盟頻道聊天訊息給聯盟內所有公會成員。

      由發話者所屬公會 gid 反查其聯盟,逐一對聯盟內各公會呼叫 MapleGuild.allianceChat(String, int, String); 公會或聯盟不存在時不做事。具跨頻道封包送出副作用。

      Parameters:
      gid - 發話者所屬公會 ID
      name - 發話者名稱
      cid - 發話者角色 ID
      msg - 聊天訊息內容
    • setNewAlliance

      public static void setNewAlliance(int gid, int allianceid)
      處理某公會新加入聯盟後的狀態同步與封包廣播。

      遍歷聯盟內各公會:對新加入的公會 gid 設定聯盟 ID、廣播聯盟資訊/聯盟變更封包、調整其聯盟階級並寫入資料庫; 對其餘既有公會則廣播「新公會加入聯盟」相關封包。聯盟或公會不存在時不做事。具資料庫寫入與跨頻道封包扇出副作用。

      Parameters:
      gid - 新加入的公會 ID
      allianceid - 聯盟 ID
    • setOldAlliance

      public static void setOldAlliance(int gid, boolean expelled, int allianceid)
      處理某公會離開聯盟(或聯盟解散)後的狀態同步與封包廣播。

      遍歷聯盟內各公會:若為離開的公會 gid(或 gid == -1 代表整個聯盟解散),則重設其聯盟階級與聯盟 ID 並廣播解散封包; 其餘公會則收到「某公會已離開聯盟」的伺服器訊息與變更/移除封包。期間遇到查無的成員公會會自聯盟中清除。 當 gid == -1 時,最後於寫鎖下將整個聯盟從快取移除。具跨頻道封包扇出與狀態移除副作用。

      Parameters:
      gid - 離開的公會 ID;傳 -1 代表聯盟整個解散並自快取移除
      expelled - true 表示被驅逐、false 表示主動退出
      allianceid - 聯盟 ID
    • getAllianceInfo

      public static List<byte[]> getAllianceInfo(int allianceid, boolean start)
      取得指定聯盟的資訊封包清單(供客戶端載入聯盟視窗)。

      starttrue 時額外含初次載入所需的 getAllianceInfogetGuildAlliance 封包, 末尾恆附 getAllianceUpdate;聯盟不存在時回傳空清單。

      Parameters:
      allianceid - 聯盟 ID
      start - 是否為初次載入(含完整初始化封包)
      Returns:
      封包位元組清單;聯盟不存在時為空清單(非 null
    • save

      public static void save()
      將所有已載入的聯盟存回資料庫。

      於寫鎖保護下逐一呼叫 MapleGuildAlliance.saveToDb();通常於伺服器關閉時呼叫。具資料庫寫入副作用。