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種方法
有些地圖在救援關卡會出現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