引用 | 編輯
11922911
2023-07-13 18:16 |
樓主
▼ |
||
![]() 插件來源:原創 https://forums.alliedmods.net/showthread.php?t=343808 使用指令:沒有 安裝路徑:gamemod/addons/amxmodx 版本:1.1.0 【插件介紹】 安裝需求:
下載地址: https://github.com/hollacs/oo_amxx/releases/latest 安裝方法: 下載後放到 addons/amxmodx 裡面有兩個測試範例插件, 請自行編譯並測試能不能正常運作 (正常應該會在控制台顯示正確的輸出訊息) 源碼: ( https://github.com/hollacs/oo_amxx/tree/no-std 在許多程式語言中,物件導向編程已經成為一種常見的編程範式。然而,在AMX Mod X (AMXX) 這樣的遊戲伺服器模塊中,物件導向編程並不是很容易實現。為了解決這個問題,我寫了一個可以讓AMXX實現OOP的模塊,使得開發人員可以更方便地使用物件導向編程。 這個模塊的核心是一個名為 OO 的庫,它提供了一個類別系統,允許開發人員創建自己的類別、物件和方法。OO 庫還提供了一些簡單的工具,例如存取類別變數和方法的函數。開發人員只需遵循一些簡單的規則來聲明和使用類別,就可以在AMXX中實現物件導向編程。 為了說明這個模塊的使用方法,讓我們來看一個簡單的例子。 #include <amxmodx> 輸出結果 你好, 我的名字叫 Dog, 現在 7 歲, 我有 4 條腿, 我會說 汪汪汪 更多使用方法說明請看 oo.inc 已知問題/限制:
![]()
|
引用 | 編輯
11922911
2023-07-28 01:25 |
4樓
▲ ▼ |
更新 2023-7-28:
重寫內核,使用 AMTL 取代 STL,修正 linux 下崩潰的問題 帖子裡加入了新的下載連結 ![]() |
引用 | 編輯
11922911
2024-03-15 20:37 |
5樓
▲ ▼ |
更新 版本 1.1.0 (2024-3-15) :
加入多重繼承功能 (詳見 oo_multiple_inheritance.sma), 多重繼承是仿照類似 python 的 MRO order 修正 oo_get 和 oo_set 不能使用類別名稱搜索 ex: oo_get(@this, "Class@var") 多重繼承範例: #include <amxmodx> 輸出結果 B1@Method1() ![]() |
引用 | 編輯
11922911
2024-06-28 16:36 |
6樓
▲ |
今天在 GitHub 最新的 commit 加入了一個實驗性的功能, 但還在測試中
這個功能是 HOOK 掛鉤系統, 有了這功能你就可以掛鉤所有插件的 OO 方法/建構和解構子 如果你想測試, 你可以到我那個 repo 的 Actions 頁面下載最新由 GitHub workflows 自動建置生成好的檔案 和下載最新的 oo.inc 檔案會在 Action 中的 Artifacts 的區塊 (你需要登入 GitHub 才能查看可以下載的檔案) ![]() HOOK 掛鉤系統 詳細使用方法: (在這個例子中我們將掛鉤 oo_animal.sma 中的東西) 複製程式 #include <amxmodx> #include <oo> public plugin_init() { // 掛鉤 Animal@Ctor() 的建構子 oo_hook_ctor("Animal", "Ctor", "OnAnimalCtor"); // 掛鉤 Dog@MakeSound() 方法 (post事件) oo_hook_mthd("Dog", "MakeSound", "OnDogMakeSound_Post", 1); // 掛鉤 Snake@GetLegs() 方法 oo_hook_mthd("Snake", "GetLegs", "OnSnakeGetLegs_1"); oo_hook_mthd("Snake", "GetLegs", "OnSnakeGetLegs_2"); // 掛鉤 Snake@Test() 方法 oo_hook_mthd("Snake", "Test", "OnSnakeTest"); // 掛鉤 Animal@Dtor() 的解構子 oo_hook_dtor("Animal", "OnAnimalDtor"); } public OnAnimalCtor(const name[], age) { server_print("OnAnimalCtor(name=%s, age=%d)", name, age); } public OnDogMakeSound_Post(msg[], len) { server_print("OnDogMakeSound_Post(msg=%s, len=%d)", msg, len); } public OnSnakeGetLegs_1() { server_print("OnSnakeGetLegs_1()"); oo_hook_set_return(369); // 改變這方法原本回傳的值 return OO_CONTINUE; } public OnSnakeGetLegs_2() { server_print("OnSnakeGetLegs_2() => oo_hook_get_return()=%d", oo_hook_get_return()); // 獲取之前改變了的回傳值 return OO_SUPERCEDE; // 阻止原本這方法的執行 } public OnSnakeTest(a, &b, const c[], d[], e[5]) { server_print("OnSnakeTest(%d, %d, %s, %s, {%d,%d,%d,%d,%d})", a, b, c ,d, e[0], e[1], e[2], e[3], e[4]); // 改變第 1 個參數 a 的值做 11 oo_hook_set_param(1, OO_CELL, 11); // 改變第 2 個參數 b 的值做 22 (因為類型是 OO_BYREF 可以直接改) b = 22; // 改變第 3 個參數 c 的值做 "33" oo_hook_set_param(3, OO_STRING, "33"); // 改變第 4 個參數 d 的值做 "44" (因為類型是 OO_STRING_REF 可以直接改) copy(d, 31, "44"); // 改變第 5 個參數 e 的值做 {11, 22, 33, 44, 55} new arr[5] = {11, 22, 33, 44, 55}; e = arr; // 因為類型是 OO_ARRAY 可以直接改 } public OnAnimalDtor() { server_print("OnAnimalDtor()"); } ![]() |