Archive for 4月 2018


我們要先查詢看看資料庫查詢是否正常
但如果直接查詢,有可能會查詢到很多的資料,會有不必要的讀取時間
議使用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插件模版,中文房名插件


最近有跟2233的房主討論一下開房的一些事情,以及他自己的經驗
所以打算再開服,讓大家找回當年的回憶

這次用的版本是UnitedRPG_V4.0,他是用SQLite的方式存檔
上一次也是用這版本,因為電腦壞了,很多檔案遺失
所以之前改過的內容都沒有了(傷心)

這次版本打算是走娛樂版本
房名叫"RPG阿土娛樂班",當然一定會有很多的BUG
有的地方我可能也不知道該怎麼寫,甚至沒有時間去修復那麼多的錯誤

但會找時間寫一個全新版本的RPG,在這之前,先玩玩這"RPG阿土娛樂班"
目前我也沒辦法雇到全部的玩家來開24小時的服
所以有限制開服的時間。

開服時段是下午的5點20到半夜0點
如果玩家大於2人會繼續開著
一直開到半夜2點關服

因為工作關係,沒辦法讓大家在放假時段也有開服
希望大家能支持這伺服器,謝謝

PS:登入打密碼指令/pw 你的密碼(例如:/pw 123456),/pw記得是小寫的英文
如果要綁定密碼,請在cfg資料夾自己新增一個autoexec.cfg檔案(不是autoexec.360.cfg喔)
裡面內容要打上setinfo rpgpw xxxxxx
xxxxxx改成你剛剛指定的密碼(例如:setinfo rpgpw 123456)

阿土進擊班回來啦


今天看到FB上有人詢問插件的設定參數,我這邊直接分享出來
玩家請依照自己的情況修改刪減

// 最大支持玩家數量(默認4)
sv_maxplayers 8

//是否移除玩家數量限制
sv_removehumanlimit 1

// 告知外界遊戲人數,該參數只是顯示用,修改該參數不限制玩家玩(默認4)
sv_visiblemaxplayers 8

//倖存者人數-對抗用
sm_cvar survivor_limit "4"

//僵屍玩家人數-對抗用
sm_cvar z_max_player_zombies "4"

//感染者人數-對抗用
sm_cvar infected_limit "4"

//難度鎖定(Easy,Normal, Hard, Impossible)
sm_cvar z_difficulty "Hard"

//遊戲模式"coop(合作),versus(對抗),survival(生存)
sm_cvar mp_gamemode "coop"

//1=只允許大廳進入
sv_allow_lobby_connect_only 0

sv_region 4 //4=亞洲,僅限亞洲

//第一個組編號數字改成自己的組,其他為熱門惡靈勢力2群組
sv_steamgroup "5435782,1927407,482,883,1154,125662,3483,4984,31572,1440535,110651,371427,554109,554111,554117,584833,589695,596657,600445,603063,606267,610951,630123,649825,707829,736485,904297,964095,1001012,1085761,1106051,1144302,1148657,1158579,1158599,1203524,1205958,1223486,1280631,1282302,1302060,1480263,2283400,1576325,1193818,1875324,895850,2100201,57407445,1895850,9138456,1168343,5210554,600445"

sv_steamgroup_exclusive 1  //只允許組內成員匹配

sm_cvar fps_max 600
sm_cvar sv_maxspeed 1000 //設定玩家端的網路傳輸最大速率值
sm_cvar rate 17500  //連接速率,默認10000(設20000以上是沒有任何意義的,甚至會降低網絡性能。)
sm_cvar sv_minrate 20000 // 服務器最小接收速率
sm_cvar sv_maxrate 30000 //0=無限  服務器最大接收速率
sm_cvar sv_maxupdaterate 66 //客戶端最大接收速率
sm_cvar sv_minupdaterate 60 //客戶端最小接收速率
sm_cvar sv_maxcmdrate 66 // 服務器最大接收速率
sm_cvar sv_mincmdrate 60 // 服務器最小接收速率
sm_cvar net_splitpacket_maxrate "1048576" //幫助一些輪開始滯後

//關閉開啟模型一致性檢查(1 開啟,0 關閉)
sv_consistency 0

// (默認10)
sm_cvar tank_stuck_time_suicide 9999

// (默認1)
sm_cvar tank_stuck_failsafe 0

惡靈勢力2 -常用設定參數

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