Skip to content

Instantly share code, notes, and snippets.

@kimoto kimoto/gist:856724
Created Mar 5, 2011

Embed
What would you like to do?
Left4Dead2: kz_teleport.sp
//
// Name: kz_teleport plugin
// Description:
// HL2のkzmodにある、checkpointを作ってそこにワープするみたいなことが出来るようになるSourceMODプラグインです
// 主に斜面のバニホ練習で、簡単に元の位置に戻るためや
// アクセルブーマーの練習で、元の位置に簡易に戻るために使用します
//
// checkpoint - このコマンドを実行したときの場所とみている方向を保存します
// teleport_to_checkpoint - 最後に保存されたcheckpointに移動します
//
// これらのコマンドを任意のキーにbindするのを推奨します
// 例:
// bind "p" "say !checkpoint; checkpoint"
// bind "o" "teleport_to_checkpoint"
// ChangeLog:
// 2011/03/14: v0.3 設計変更(すべてのプレイヤーの座標を保存するようにした)
// 2011/03/14: v0.2 source code cleanup
// 2010/**/**: v0.1 released
//
#include <sourcemod>
#include <sdktools>
#define PLUGIN_VERSION "0.3"
#define TEAM_SURVIVOR 2
#define TEAM_INFECTED 3
#define PLUGIN_FILENAME "kz_teleport"
#define DEBUG_STRING_BUFFER_SIZE 256
new Handle:g_hEnable = INVALID_HANDLE;
new Handle:g_hDebug = INVALID_HANDLE;
new bool:g_bEnable = true;
new bool:g_bDebug = true;
#define PLAYER_INFO_SIZE 7
new Handle:g_hPlayerInfo = INVALID_HANDLE;
new bool:savedFlag = false;
public Plugin:myinfo =
{
name = "kz_teleport",
author = "kimoto",
description = "kz style teleport plugin",
version = PLUGIN_VERSION,
url = "http://steamcommunity.com/id/kimoto"
}
public OnPluginStart()
{
CreateConVar("kz_teleport_version", PLUGIN_VERSION, "kz style teleport plugin version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
g_hEnable = CreateConVar("kz_teleport_enable", "1", "Enable/Disable kz style teleport plugin", FCVAR_PLUGIN);
g_hDebug = CreateConVar("kz_teleport_debug", "0", "Enable/Disable kz style teleport plugin debug show", FCVAR_PLUGIN);
HookConVarChange(g_hEnable, OnConVarsChanged);
HookConVarChange(g_hDebug, OnConVarsChanged);
AutoExecConfig(true, PLUGIN_FILENAME);
ReloadConvars();
RegConsoleCmd("checkpoint", Command_SetCheckpoint)
RegConsoleCmd("teleport_to_checkpoint", Command_TeleportToCheckpoint)
}
#define MAX_LINE_WIDTH 64
public IsClientBot(client)
{
decl String:SteamID[MAX_LINE_WIDTH];
GetClientAuthString(client, SteamID, sizeof(SteamID));
if (StrEqual(SteamID, "BOT"))
return true;
return false;
}
public DebugPrint(const String:Message[], any:...)
{
if (g_bDebug)
{
decl String:DebugBuff[DEBUG_STRING_BUFFER_SIZE];
VFormat(DebugBuff, sizeof(DebugBuff), Message, 2);
LogMessage(DebugBuff);
}
}
public Action:Command_SetCheckpoint(client, args)
{
DebugPrint("checkpoint");
new Float:origin[3];
new Float:rotation[3];
new Float:data[PLAYER_INFO_SIZE];
g_hPlayerInfo = CreateArray(PLAYER_INFO_SIZE);
ClearArray(g_hPlayerInfo);
// すべてのプレイヤーの座標を取得する、そして保存する
// BOTは保存対象から除外
for(new i=1; i<=GetMaxClients(); i++) {
// ingame and not bot player
if(IsClientInGame(i) && !IsClientBot(i)) {
DebugPrint("client: %d", i);
DebugPrint("user id is: %d", GetClientUserId(i));
GetClientAbsOrigin(i, origin);
GetClientAbsAngles(i, rotation);
DebugPrint("origin: %f %f %f", origin[0], origin[1], origin[2]);
DebugPrint("rotation: %f %f %f", rotation[0], rotation[1], rotation[2]);
data[0] = i; // client index
data[1] = origin[0];
data[2] = origin[1];
data[3] = origin[2];
data[4] = rotation[0];
data[5] = rotation[1];
data[6] = rotation[2];
PushArrayArray(g_hPlayerInfo, data);
DebugPrint("pushed array");
savedFlag = true;
}
}
return Plugin_Continue;
}
public Action:Command_TeleportToCheckpoint(client, args)
{
new Float:origin[3];
new Float:rotation[3];
new Float:velocity[3];
new Float:data[PLAYER_INFO_SIZE];
DebugPrint("teleport_to_checkpoint");
if( savedFlag )
{
for(new i=0; i<GetArraySize(g_hPlayerInfo); i++){
GetArrayArray(g_hPlayerInfo, i, data);
origin[0] = data[1];
origin[1] = data[2];
origin[2] = data[3];
rotation[0] = data[4];
rotation[1] = data[5];
rotation[2] = data[6];
velocity[0] = velocity[1] = velocity[2] = 0.0;
DebugPrint("saved origin:\nclient(%d) %f %f %f\n%f %f %f", data[0], origin[0], origin[1], origin[2], rotation[0], rotation[1], rotation[2]);
TeleportEntity(data[0], origin, rotation, velocity);
DebugPrint("warped");
}
}
}
// modify convars
public OnConVarsChanged(Handle:hConVar, const String:oldValue[], const String:newValue[])
{
ReloadConvars();
}
public ReloadConvars()
{
// reload convars
g_bEnable = GetConVarBool(g_hEnable);
g_bDebug = GetConVarBool(g_hDebug);
DebugPrint("convar reloaded");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.