顯示具有 SP原碼 標籤的文章。 顯示所有文章


猜測是遊戲版本2139開始的問題,只要有安裝多人插件使用Zoey腳色的時候就會有問題
因為Valve在某種程度上無法解決崩潰問題,因此這個插件可以解決這個問題(這不會修復崩潰)

插件作者的解決方式是利用場景處理器和​​尼克作為我們的基礎角色,我們給角色一個Zoey模型,來替代

插件下載
https://drive.google.com/file/d/1RCSIhaTo7jwWsbKLV1MQX8DqW-a9PS1-/view?usp=sharing

裡面要先使用場景處理器
sceneprocessor.sp

把它製作成smx,在安裝FakeZoey
一樣全部複製過去並製作成smx



Zoey崩潰的解決方法 惡靈勢力2


末日Z戰首周就已經銷售1百萬套了,遊戲利用 Swarm 引擎可以一次產生數百個殭屍
讓玩家玩起來很有爽快感

今天主要講的不是末日Z戰,而是惡靈勢力2,惡靈勢力2到現在已經快10年了
玩家們一直等不到惡靈勢力3的出來,有的玩家任為末日Z戰有惡靈勢力3的風格
但我覺得還是惡靈勢力2比較好玩

末日Z戰的優點就是有大量的殭屍可以讓玩家殺爽爽的
但是這惡靈勢力2也可以做到
不管是遊戲難度、職業、新地圖...等等,都比末日Z戰還難、地圖更多,
也能有更多的玩家可以一起共同打殭屍

下面就來介紹要怎麼設定

     安裝Tickrate Enabler     


插件主體SourceMod安裝略過
下載擴件
https://drive.google.com/file/d/1J_9y9tAnSvihyHwum18bmSyQwI5XRjdx/view?usp=sharing

下載後解壓縮,將裡面的addons資料夾附蓋貼上伺服器的addons資料夾即可

什麼是Tickrate
簡單的說就是網游是依賴服務器和各客戶端協同運作的,每個玩家客戶端不斷向服務器發送玩家的指令的狀態(例如開槍、移動、瞄準等動作),服務器接收全部玩家的輸入後,通過計算將結果反饋給各個客戶端,(比如擊中敵人與被擊中,地圖某個區域該出現煙霧、閃光,並作用到你的客戶端)如此循環往復。

Tickrate就是服務器每秒鐘接收並運算的次數。例如CS:GO職業比賽和專業平台的128Tick就是每秒運算128次,折合每次運算間間隔僅有7.8毫秒。而我們目前的電競顯示器也就是144Hz,基本上與服務器運算次數相近。

Tickrate可以說是除了ping值以外最重要的一個參數

     設定server.cfg参數     


sm_cvar fps_max "600"//限制最大FPS值
sm_cvar sv_maxspeed "1000" //設定玩家端的網路傳輸最大速率值
sm_cvar rate "17500" //連接速率,默認10000(設20000以上是沒有任何意義的,甚至會降低網絡性能。)
sm_cvar sv_minrate "60000" // 服務器最小接收速率
sm_cvar sv_maxrate "60000" //0=無限  服務器最大接收速率
sm_cvar sv_maxupdaterate "120" //服務器允許的每秒最大更新數
sm_cvar sv_minupdaterate "120" //服務器允許的每秒最小更新數
sm_cvar sv_maxcmdrate "120" // 服務器最大接收封包
sm_cvar sv_mincmdrate "120" // 服務器最小接收封包
sm_cvar net_splitpacket_maxrate "120000"//每秒最大位原組

sm_cvar sv_client_min_interp_ratio "-1"
sm_cvar sv_client_max_interp_ratio "2"

//強制屍潮事件不斷
director_panic_forever "1"

//每次衝向你的僵屍數
sm_cvar z_common_limit "90"

以上複製貼上就可以了

     設定srcds.exe参數     

建立一個srcds.exe的捷徑

在新增的捷徑上面右鍵>>內容

在目標最後面按空格後輸入
-game "left4dead2" -console -noipx +maxplayers 32  +map c1m1_hotel -tickrate 128

-tickrate 128就是上面提到的服務器每秒鐘接收並運算128次

     下載 lerptracker.sp     

下載插件
https://drive.google.com/file/d/1jCs31DpKyA9AbQsdWAZu4zBfFvM6Aqms/view?usp=sharing

 lerptracker.sp 主要是修正伺服器跟玩家看到實體的位置不同部
例如獵人撲過來時,玩家看畫面已經撲過來了,但是實體卻還沒有跟上

之後會在另一篇作解釋

     下載 l4d2_ASDC.sp     

插件下載
https://drive.google.com/file/d/1bwnbpi-iRyHm4-mM04L1D9zu0xwGMc_a/view?usp=sharing

 l4d2_ASDC.sp 可以自動產生額外的殭屍以增加難度
裡面設定還蠻多的,要讓玩家自行決定要一次出來多少殭屍

這樣就能做出像末日Z戰出來大量殭屍


讓惡靈勢力2也能有末日Z戰大量殭屍


我們開始把遊戲難度調難,特感跟殭屍的數量變多,修改坦克血量
就會開始發現子彈開始不夠用了

有的人會選擇增加主武器的子彈數,或是在慢慢調整特感數量或坦克數量
也有像我直接用RPG的系統讓玩家慢慢變強以及購買各種裝備子彈,或使用基本的商店系統
來達到最好的遊戲平衡

這裡要介紹的插件是讓倖存者可以帶兩把主武器,醫療包等等
作者是很有名的小海,相信很多人都有用過他的插件

插件下載
https://drive.google.com/open?id=18xHv1KOPEkqasw59HQ9RCR_IUW9iHtfx

     使用方法     


開關項目:
模式1:1,2,3,4,5
模式2:雙開關(例如雙Q,雙1,2,3,4,5)

或者使用命令:!sm_s0
恢復:!shove

在聊天視窗輸入:
!me: 選擇切换武器的方法
!s0: 切换项目

     安裝步驟     


下載好檔案將檔案放在scripting資料夾
舉例(D:\steam\steamapps\common\L4D2test\left4dead2\addons\sourcemod\scripting)

然後將檔案拖曳到compile.exe上面製作SMX檔案


成功會出現這訊息


這樣代表沒有任何錯誤以及警告
SMX會產生在compiled資料夾裡面
舉例(D:\steam\steamapps\common\L4D2test\left4dead2\addons\sourcemod\scripting\compiled)


把檔案剪下貼上到plugins資料夾
舉例(D:\steam\steamapps\common\L4D2test\left4dead2\addons\sourcemod\plugins)


之後啟動伺服器跟遊戲來測試看看





     原碼錯誤調整     


因為插件版本很久了,作者可能覺得沒有影響,或是已經沒有在修復
所以我自己修復嚕


出現2個Warnings,其實可以忽略,但有時候不代表插件本身沒有問題
檔案名稱XXX.sp後面的括號代表是第幾行附近有問題

217: loose indentation代表程式語法沒有排整齊,或是有的地方使用多次空格,而不是縮排
204: symbol is assigned a value that is never used: "w"
never used白話就是沒有使用過,所以這邊要看是完全不需要還是打錯,沒有給他正確的值

我這邊直接把294~298註解起來

倖存者可以帶兩把主武器,醫療包等等 l4d_multiple_equipment_all 惡靈勢力2


有的玩家裝了插件都會去裝多人,但通常只要人數一多難度就會開始下降
這插件可以依照人數去改變遊戲裡面的難度
插件設定是
1個玩家難度設為簡單
2個玩家難度設為一般
3個玩家難度設為困難
4個玩家難度設為專家
你也可以修改插件原碼或是直接修改CFG來設定多少玩家(裝多人插件)來改變難度

插件下載
https://drive.google.com/file/d/1Y8_KN0wPTBdppDWkxFyuAWbMpiAWkxJQ/view?usp=sharing

     安裝步驟     

下載好檔案將檔案放在scripting資料夾
舉例(D:\steam\steamapps\common\L4D2test\left4dead2\addons\sourcemod\scripting)

然後將檔案拖曳到compile.exe上面製作SMX檔案


成功會出現這訊息


這樣代表沒有任何錯誤以及警告
SMX會產生在compiled資料夾裡面
舉例(D:\steam\steamapps\common\L4D2test\left4dead2\addons\sourcemod\scripting\compiled)


把檔案剪下貼上到plugins資料夾
舉例(D:\steam\steamapps\common\L4D2test\left4dead2\addons\sourcemod\plugins)


之後啟動伺服器跟遊戲來測試看看


聊天那邊有出現遊戲難度改為簡單就成功了

依照倖存者數量調整難度difficulty_adjustment_system 惡靈勢力2


這裡教大家編寫SourceMod插件的基本介紹,SourceMod他是使用SourcePawn中使用的Pawn的版本,Pawn是一種“腳本”語言,用於在其他程序中嵌入功能。這意味著它不是獨立的語言,如C ++或Java,其細節將根據應用程序而有所不同。

您可以使用SPEdit,Crimson Editor,PSPad,UltraEdit,Notepad ++,TextPad,Pawn Studio,BasicPawn或任何其他您喜歡編寫插件的程式編輯器。

從頭開始

打開你最喜歡的程式編輯器,並創建一個新的空文件。
當你有一個空文件時,你可以開始用核心語言編寫代碼,但是,你將無法使用任何的SourceMod功能,因為編輯器不知道它們。

這是故意做的,所以可以在SourceMod之外使用SourcePawn。但是由於我們正在編寫一個SourceMod插件,因此首先啟用對SourceMod功能的訪問是一個好主意。

這是使用#include指令完成的。它告訴編譯器將來自另一個文件的代碼“複製貼上”到你的代碼中。

#include <sourcemod>

這個怎麼用?
首先,請注意,我們將文件名包含在<>括號中。
<>括號告訴編譯器查看默認的include目錄。

默認情況下,它會在遊戲路徑\left4dead2\addons\sourcemod\scripting\include。
你現在可以打開它並在那裡看到很多inc文件。
這些是SourceMod包含文件(要先安裝SourceMod平台),用於描述可用於SourceMod插件的各種功能,標記和其他功能。

這些文件是純文字的,如果時間允許可以閱讀它們。
但是,您會注意到,那裡沒有太多的代碼,當然不足以實現SourceMod的所有優點

它們是在用C ++編寫的SourceMod內核中實現的,並且被編譯為以bin結尾的二進製文件目錄。
那麼如果編譯器不知道後者的存在,你的SourcePawn代碼和SM核心如何鏈接在一起?

SourceMod包含文件是專門編寫的,所以他們說功能的實現在別的地方。編譯器知道這一點,並生成一個特殊的代碼,說明這個函數調用正在外面。當SourceMod加載您的插件時,它會檢查這些代碼並替換它自己的內部函數。這被稱為動態鏈接。

設置插件信息

現在我們可以訪問SourceMod功能,現在可以設置通過sm plugins list命令顯示的信息了。

我們可以查看sourcemod.inc文件,並查看應該聲明信息的格式。查看SM包含文件以查找您不知道的信息總是有幫助的。
還有一個API文檔,但它可能已過時,並且它只有SM核心文件,所以如果您的插件要使用任何第三方擴展或其他插件,則必須學習inc文件。所以,打開sourcemod.inc並向下滾動一下,直到看到:

/**
 * Plugin public information.
 */
struct Plugin
{
   public const char[] name;        /**< 插件名稱 */
   public const char[] description;    /**< 插件說明 */
   public const char[] author;        /**< 插件作者 */
   public const char[] version;        /**< 插件版本 */
   public const char[] url;            /**< 插件網址 */
};

和這個

/**
 * Declare this as a struct in your plugin to expose its information.
 * Example:
 *
 * public Plugin myinfo =
 * {
 *    name = "My Plugin",
 *    //etc
 * };
 */
public Plugin myinfo;

它告訴我們,我們需要創建一個全局公共變量myinfo,它必須是Plugin類型,它是一個包含5個字段的結構體,它們本身就是字符串。
對初學者來說聽起來很複雜,但很簡單。讓我們繼續創建一個:

public Plugin myinfo =
{
    name = "我的第一個插件",
    author = "作者",
    description = "我的第一個插件說明",
    version = "1.0",
    url = "http://www.sourcemod.net/"
};

該公共關鍵字意味著SourceMod將能夠直接訪問我們的變量。
插件:定義我們的變量的類型。

myinfo顯然是SourceMod所需的我們變量的名稱。
這是填寫插件信息的最佳方式。
之後,你的插件的完整代碼應該是這樣的:

#include <sourcemod>
 
public Plugin myinfo =
{
    name = "我的第一個插件",
    author = "作者",
    description = "我的第一個插件說明",
    version = "1.0",
    url = "http://www.sourcemod.net/"
};

獲取代碼運行

我們已經包含了SourceMod功能並且已經設定插件信息。
我們現在有一個完美格式的插件,可以通過SourceMod進行編譯和加載。

但是,有一個問題 - 它什麼功能都沒有。
您可能會試圖在myinfo聲明之後開始編寫代碼,以確保它不會編譯。
與其他腳本語言如Lua不同,SourcePawn不允許代碼在函數之外。

閱讀完之後,你可能想要定義一些函數,可能主要命名它,編譯並加載一個插件,看看你的代碼永遠不會被調用。
那麼我們如何讓SourceMod調用我們的代碼呢?

可以由另一方作為回調來實現。
當第一方開始前轉呼叫時,具有匹配回叫的所有方接收該呼叫。
SourceMod聲明了我們可以實現的大量有趣的內容。

正如你所看到的,轉發是讓我們的代碼執行的唯一方法,牢記這一點。
所以讓我們先實現OnPluginStart。
正如您可能已經猜到的那樣,我們的插件啟動時會調用它。
為此,我們必須查看OnPluginStart的聲明。
它在sourcemod.inc裡面聲明,我們已經熟悉這個文件,讓我們來找到它:

/**
 *當插件完全初始化並調用所有已知的外部引用時調用
 *已解決。 這只在插件的生命週期中調用一次,並且是
 *與OnPluginEnd()配對。
 *
 *如果在此回調期間發生任何運行時錯誤,則插件將被標記
 *失敗。
 *
 *不需要關閉此功能中的任何手柄或刪除掛鉤。
 * SourceMod保證插件自動關閉並正確釋放
 *所有資源。
 *
 * @noreturn
 */
forward void OnPluginStart();

空括號告訴我們,在這個轉發中沒有任何參數被傳遞,@noreturn文檔裡面告訴我們,我們不需要返回任何東西,很簡單。

那麼如何為它寫一個正確的回調呢?首先,我們的回調必須具有相同的名稱,所以它的OnPluginStart,其次,我們的回調應該有相同數量的參數,在這種情況下,最後,SourceMod需要能夠調用我們的回調,因此它需要公開。所以實現如下所示:

public void OnPluginStart ()
{ 
}

現在我們可以在大括號內編寫代碼,並且它會在我們的插件啟動時執行。

我們輸出“Hello world!” 到服務器控制台。為此,我們將使用PrintToServer函數。它在console.inc中聲明,

但是,我們不需要手動包含console.inc,因為它是作為sourcemod.inc的一部分自動包含的。

/**
 * 將消息發送到服務器控制台.
 *
 * @param format         格式化規則.
 * @param ...            可變數量的格式參數.
 * @noreturn
 */
native int PrintToServer(const char[] format, any ...);

正如你所看到的,這是一個本地函數。它在SM內核中實現。從它的論點來看,我們可以看到它是一個格式類函數。

但是,我們現在不需要任何格式,所以讓我們通過“Hello world!” 字符串作為唯一參數:

public void OnPluginStart ()
{ 
    PrintToServer (“Hello world!” ) ;
}

完成!你的插件的完整代碼應該是下面這樣的:

#include <sourcemod>
 
public Plugin myinfo =
{
    name = "我的第一個插件",
    author = "作者",
    description = "我的第一個插件說明",
    version = "1.0",
    url = "http://www.sourcemod.net/"
}; public void OnPluginStart() { PrintToServer("Hello world!"); }

在您的服務器上編譯並加載您的插件,並親自看到該消息顯示在服務器控制台中。

参考資料
https://wiki.alliedmods.net/Introduction_to_SourcePawn_1.7
https://wiki.alliedmods.net/Introduction_to_SourceMod_Plugins


SourceMod插件的基本介紹#1


一般只要使用冰動相關技能,都會有一個爆風效果,但這會導致把玩家震開
這常常會讓玩家飛到場外,造成不必要的紛爭

這技能都會分別設定友傷跟敵傷,所以我們要把爆風的攻能放在敵傷那裏面

爆風功能語法是PointPush


搜尋PointPush可以找到8個地方有使用,1個爆風主程式
語法大概是下面這樣

PointPush(Client, pos, 1000, IceBallRadius[Client], 0.5);

將這些放在特感的判斷理面,例如下面

                    if(GetClientTeam(i) == 3 && IsPlayerAlive(i) && !IsPlayerGhost(i))
                    {
                        GetEntPropVector(i, Prop_Send, "m_vecOrigin", entpos);
                        SubtractVectors(entpos, pos, distance);
                        if(GetVectorLength(distance) <= Radius)
                        {
                            DealDamage(Client, i, IceBallDamage[Client], 0 , "chain_lightning");
                            FreezePlayer(i, entpos, IceBallDuration[Client]);
                        }
                    }

要記得把PointPush放在攻擊範圍Radius判斷裡面

修改惡靈勢力2 RPG的寒冰爆彈相關技能會把我方倖存者炸飛的Bug


我們要先查詢看看資料庫查詢是否正常
但如果直接查詢,有可能會查詢到很多的資料,會有不必要的讀取時間
議使用SQL_FastQuery(),這是最簡單的查詢而且不會返回結果

例如,假設db是一個可正常連線而且有效的數據庫句柄(Handle):

if (!SQL_FastQuery(db, "UPDATE stats SET players = players + 1"))
{
    char error[255];
    SQL_GetError(db, error, sizeof(error));
    PrintToServer("Failed to query (error: %s)", error);
}

SQL_FastQuery加上驚嘆號就是查詢失敗
所以只要if裡面查詢失敗就會執行下面的部分

查詢失敗就使用SQL_GetError查找最後一個錯誤


惡靈勢力2判斷資料庫是否查詢的到資料(SQL_FastQuery)


惡靈勢力2原碼連到資料庫有兩種方法。

第一種是通過命名配置,命名配置是在
addons\sourcemod\configs\databases.cfg中列出的預設配置。

SourceMod指定如果正在使用SQL,預設有一個名為“default”的配置。

"default"
    {
        "host"                "localhost"
        "database"            "sourcemod"
        "user"                "root"
        "pass"                ""
        //"timeout"            "0"
        //"port"            "0"
    }

  • host 連線主機的位置,如果Mysql資料庫跟你遊戲Server同一台電腦使用localhost即可
    或是打上資料庫的那台電腦IP
  • database 要連線的資料庫名稱,這名稱要自己在Mysql創一個新資料庫
  • user 使用者名稱,預設是root
    root這使用者安裝MySQL時一定會有
  • pass 使用者密碼,預設的root帳號的密碼是空的,不需要輸入
    日後有修改密碼要記的修改
  • timeout 連線逾時的時間,有註解了不會執行
  • port 資料庫的連接埠,也有註解不用輸入,MySQL的port預設是3306
    除非安裝時有修改才要設定,並把//註解拿掉

另外也能不使用default,自己再增加一個自己取的名字

基於命名配置的連接,在原碼可以使用SQL_Connect或SQL_DefConnect實例化

SQL_Connect範例,可放在插件開始的地方OnPluginStart

#define DB_CONF_NAME "atol4d2SQL"//databases.cfg裡面命名的名稱
//建立與數據庫的連接
bool:ConnectDB()
{
    if (db != INVALID_HANDLE)
        return true;
    
    if (SQL_CheckConfig(DB_CONF_NAME))
    {
        new String:Error[256];
        db = SQL_Connect(DB_CONF_NAME, true, Error, sizeof(Error));

        if (db == INVALID_HANDLE)
        {
            LogError("無法連接到數據庫: %s", Error);
            return false;
        }
        else if (!SQL_FastQuery(db, "SET NAMES 'utf8'"))
        {
            if (SQL_GetError(db, Error, sizeof(Error)))
                LogError("無法將編碼更新為 UTF8: %s", Error);
            else
                LogError("無法將編碼更新為UTF8:未知");
        }
    }
    else
    {
        LogError("Databases.cfg 缺少 '%s' 輸入!", DB_CONF_NAME);
        return false;
    }

    return true;
}

SQL_DefConnect範例,可放在玩家進入遊戲或插件開始OnPluginStart相關判斷的地方

char error[255];
Database db = SQL_DefConnect(error, sizeof(error));
 
if (db == null)
{
    PrintToServer("Could not connect: %s", error);
} 
else 
{
    delete db;
}



另一種選擇是使用SQL_ConnectCustom並通過傳遞包含它們的keyvalue句柄來手動指定所有連接參數

// The function to call, when you want to connect to the database
stock Database_Connect() {
    // Make sure to close the database handle, in case you try to connect more than once
    if (g_hDatabase != INVALID_HANDLE) {
        CloseHandle(g_hDatabase);
        g_hDatabase = INVALID_HANDLE;
    }

    // Only connect if the handle is invalid
    if (g_hDatabase == INVALID_HANDLE) {
        // Use KeyValues for login credentials
        new Handle:hKeyValues = CreateKeyValues("");
        KvSetString(hKeyValues, "host", "YOUR DATABASE ADDRESS HERE");
        KvSetString(hKeyValues, "database", "YOUR DATABASE NAME HERE");
        KvSetString(hKeyValues, "user", "YOUR DATABASE USER HERE");
        KvSetString(hKeyValues, "pass", "YOUR DATABASE PASSWORD HERE");

        // Connect and write errors to sError
        decl String:sError[512];
        g_hDatabase = SQL_ConnectCustom(hKeyValues, sError, sizeof(sError), true);
        
        // Close the KeyValues handle to free memory
        CloseHandle(hKeyValues);

        if (g_hDatabase == INVALID_HANDLE) {
            // An error has occured if the database handle is still invalid
            LogError("[Database] Failed to connect to the database! Error: %s", sError);
        } else {
            // Successfully connected to the database
            // Now you can use g_hDatabase to query your database
            PrintToServer("[Database] Successfully connected to the database");
        }
    }
}

這種的方式我覺得比較複雜,看各位要選擇哪一種方式了
SQL_Connect或SQL_DefConnect算是比較雷同的寫法,也有人使用SQL_ConnectCustom
這三種選一種方法即可,不用三個語法都加到自己原碼裡

我這邊之後會研究SQL_DefConnect的寫法,感覺簡單一點

惡靈勢力2連接資料庫的2種方法


強制出坦的插件有很多種,我裝的都遇到坦克會直接在玩家面前出現
例如:l4d_tanks.sp
一般都是使用GetCommandFlags來強制執行Command命令列
詳細語法就不列出了

使用z_spawn來產生坦克,但這語法就是在面前出現
要把所有使用到z_spawn的關鍵字改成z_spawn_old

但這又會衍伸另一個問題
根據國外玩家的說法,用這方法有可能坦克會出現在意想不到的位置


惡靈勢力2 依時間出坦克會直接出現在玩家面前的Bug修復


有些地圖在救援關卡會出現3波坦克,但RPG本身有限制坦克出現的數量的
只要達到上限就不會出坦克

像我目前這版本上限居然只設定3隻坦克而已
然後RPG本身有等級系統,達到猛一階段總等級就會在同一波的時候出現多支坦克
所以如果一次出2隻,到了第二波就會超過數量了(預設上限是3隻)

所以到了第3波,坦克無法出來,就無法過關

下面是修改原碼的步驟
主要是修改UnitedRPG_V4.0.sp檔案

搜尋關鍵字RoundTankLimit


將後面的3改成你要出現的上限值

另外rpg_constant.inc有一個宣告
new RoundTankLimit = 20;
改這邊的並不會有做用,會被UnitedRPG_V4.0.sp檔案裡面的值重新定義

修改惡靈勢力2 RPG坦克上限數量,防止救援關卡坦克數量一次出來太快到達上限造成卡關


RPG4.0SQLite版本的Robot他的傷害一開始是幾乎沒有的
除非到了後期,力量開始變高之後,或是購買商城裝備才會變痛

下面介紹要在哪邊可以調整

修改檔案:
rpg_constant.inc

搜尋RobotAttackEffect

#define RobotAttackEffect[%1]          Str[%1] * 0.0025 + 1 * ZB_GunDmg[%1] + NewLifeCount[%1] * 15

把他修改成

#define RobotAttackEffect[%1]          1 + Str[%1] * 0.0025 + 1 * RobotUpgradeLv[%1][0]

1是最小傷害,額外力量點數美點提升0.0025傷害
後面的RobotUpgradeLv[%1][0]是ROBOT升級,升級就加傷害
但他的商店也沒有製作完善,也無法升級,這部分之後會再另一篇介紹

惡靈勢力2 RPG原碼Robot傷害語法修復


惡靈勢力2要觸發某些功能都要透過這些事件才能啟動
例如:玩家受傷、玩家死亡等等

下方是國外的所有事件清單,還列出了簡易的用法,不過都是英文的

通用事件
https://wiki.alliedmods.net/Generic_Source_Events

通用伺服器事件
https://wiki.alliedmods.net/Generic_Source_Server_Events

惡靈勢力2事件
https://wiki.alliedmods.net/Left_4_Dead_2_Events

有些是直接就可以用的事件
像是OnPluginStart
用法:

public OnPluginStart()
{
    功能寫裡面
}


下面再舉例一些用法


例如第一行
HookEvent("item_pickup", evtRoundStartAndItemPickup_mul);//物品撿取

HookEvent要放在OnPluginStart裡面
意思就是插件開始時就執行事件,要執行的事件就是物品撿取item_pickup
事件名稱都是固定的,沒辦法改,但是我們可以設定前往public(類別)的名稱

有的時候會有相同的事件要使用不同的功能,所以就要去設定不同的public(類別)的名稱
例如上面舉例的evtRoundStartAndItemPickup_mul

然後就會執行這public


我們一般會使用到的事件可能只有10幾種,不需要全部都去了解,有使用到的時候再去用關鍵字再去查詢即可

我的表達方式可能還是會有些地方不清楚,歡迎在下方留言提供建議

惡靈勢力2 遊戲各事件簡易介紹


一開始學原碼遇到的問題就是,下載別人的原碼內容都很多
我覺得對於一開始想學插件的人不容易上手

下面會慢慢的解說用途

#include <sourcemod>
#include <sdktools>


public Plugin:myinfo = 
{
    name = "",
    author = "",
    description = "",
    version = "",
    url = ""
}

public OnPluginStart()
{
    decl String:game_name[64];
    GetGameFolderName(game_name,sizeof(game_name));
    if(!StrEqual(game_name,"left4dead",false) && !StrEqual(game_name,"left4dead2",false))
    SetFailState("此插件只支持惡靈勢力2");
}

 這邊開始解說 


#include <sourcemod>
#include <sdktools>
上面兩行代表的是讀取外部的sourcemod和sdktools檔案
這兩行是最基本 必須要寫的

7-11行
name = "插件名稱",
author = "作者",
description = "插件簡易說明",
version = "1.0",
url = "插件網址"

version後面的1.0是插件版本 可以改成自己想要的

14行
OnPluginStart
插件開始會執行{}裡面的內容

16行
decl String:game_name[64];
decl聲明一個變量,一般只用在局部變量
String是字串(文字)
game_name(自己定義)字串名稱
最後的[64]代表文字長度

GetGameFolderName
取得遊戲目錄的名稱
後面括弧用法
(緩衝區緩衝區來存儲遊戲目錄名稱,
maxlength緩衝區的最大大小)

因為不知道長度,所以使用sizeof來取得名稱的長度

if是判斷式
可以把它當作是"如果"的意思,如果if右方的內容成立
就執行下方的程式

例如:如果遊戲名稱不等於left4dead也不等於left4dead2
就停止此插件,並提示此插件只支持惡靈勢力2

以上說明可能還不夠完整,如果還有疑問,可以在下方留言喔

惡靈勢力2 SP插件模版,中文房名插件

►

- Copyright © 阿土進擊班 - Blogger Templates - Powered by Blogger - Designed by Johanes Djogan -