顯示具有 SP原碼 標籤的文章。 顯示所有文章
猜測是遊戲版本2139開始的問題,只要有安裝多人插件使用Zoey腳色的時候就會有問題
因為Valve在某種程度上無法解決崩潰問題,因此這個插件可以解決這個問題(這不會修復崩潰)
插件作者的解決方式是利用場景處理器和尼克作為我們的基礎角色,我們給角色一個Zoey模型,來替代
插件下載
https://drive.google.com/file/d/1RCSIhaTo7jwWsbKLV1MQX8DqW-a9PS1-/view?usp=sharing
裡面要先使用場景處理器
sceneprocessor.sp
把它製作成smx,在安裝FakeZoey
一樣全部複製過去並製作成smx
Zoey崩潰的解決方法 惡靈勢力2
這算個小趣味的插件
Hunter和Charger 投擲炸彈 膽汁可以出現不同顏色的彩色路徑
顏色可以自己設定
插件下載
https://drive.google.com/file/d/1hCY8NJIrbdgvhGh7GIj-Sf7plNj26Gxg/view?usp=sharing
因為只有一瞬間,不好截圖
Hunter和Charger 投擲炸彈 膽汁出現彩色路徑 Trails_Projectile 惡靈勢力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的捷徑 |
![]() |
| 在新增的捷徑上面右鍵>>內容 |
![]() |
| 在目標最後面按空格後輸入 |
-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種方法
有些地圖在救援關卡會出現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
以上說明可能還不夠完整,如果還有疑問,可以在下方留言喔









































