求生之路2复活及传送玩家插件 l4d_sm_respawn 插件源码 l4d_sm_respawn.sp l4d_sm_respawn.smx。求生之路2,l4d,l4d2,SourceMOD 插件源码。
官网:https://forums.alliedmods.net/showthread.php?t=96249
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#define PLUGIN_VERSION "1.9.3"
public Plugin:myinfo =
{
name = "L4D SM Respawn",
author = "AtomicStryker & Ivailosp",
description = "Let's you respawn Players by console",
version = PLUGIN_VERSION,
url = "http://forums.alliedmods.net/showthread.php?t=96249"
}
static Float:g_pos[3];
static Handle:hRoundRespawn = INVALID_HANDLE;
static Handle:hBecomeGhost = INVALID_HANDLE;
static Handle:hState_Transition = INVALID_HANDLE;
static Handle:hGameConf = INVALID_HANDLE;
public OnPluginStart()
{
decl String:game_name[24];
GetGameFolderName(game_name, sizeof(game_name));
if (!StrEqual(game_name, "left4dead2", false) && !StrEqual(game_name, "left4dead", false))
{
SetFailState("Plugin supports Left 4 Dead and L4D2 only.");
}
LoadTranslations("common.phrases");
hGameConf = LoadGameConfigFile("l4drespawn");
CreateConVar("l4d_sm_respawn_version", PLUGIN_VERSION, "L4D SM Respawn Version", FCVAR_PLUGIN | FCVAR_SPONLY | FCVAR_NOTIFY);
RegAdminCmd("sm_respawn", Command_Respawn, ADMFLAG_BAN, "sm_respawn <player1> [player2] ... [playerN] - respawn all listed players and teleport them where you aim");
if (hGameConf != INVALID_HANDLE)
{
StartPrepSDKCall(SDKCall_Player);
PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "RoundRespawn");
hRoundRespawn = EndPrepSDKCall();
if (hRoundRespawn == INVALID_HANDLE) SetFailState("L4D_SM_Respawn: RoundRespawn Signature broken");
StartPrepSDKCall(SDKCall_Player);
PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "BecomeGhost");
PrepSDKCall_AddParameter(SDKType_PlainOldData , SDKPass_Plain);
hBecomeGhost = EndPrepSDKCall();
if (hBecomeGhost == INVALID_HANDLE && StrEqual(game_name, "left4dead2", false))
LogError("L4D_SM_Respawn: BecomeGhost Signature broken");
StartPrepSDKCall(SDKCall_Player);
PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "State_Transition");
PrepSDKCall_AddParameter(SDKType_PlainOldData , SDKPass_Plain);
hState_Transition = EndPrepSDKCall();
if (hState_Transition == INVALID_HANDLE && StrEqual(game_name, "left4dead2", false))
LogError("L4D_SM_Respawn: State_Transition Signature broken");
}
else
{
SetFailState("could not find gamedata file at addons/sourcemod/gamedata/l4drespawn.txt , you FAILED AT INSTALLING");
}
}
public Action:Command_Respawn(client, args)
{
if (args < 1)
{
ReplyToCommand(client, "[SM] Usage: sm_respawn <player1> [player2] ... [playerN] - respawn all listed players");
return Plugin_Handled;
}
decl String:arg1[MAX_TARGET_LENGTH];
decl String:target_name[MAX_TARGET_LENGTH];
new target_list[MAXPLAYERS];
new target_count;
new bool:tn_is_ml;
GetCmdArg(1, arg1, sizeof(arg1));
if ((target_count = ProcessTargetString(
arg1,
client,
target_list,
MAXPLAYERS,
0, // no filtering
target_name,
sizeof(target_name),
tn_is_ml)) <= 0)
{
/* This function replies to the admin with a failure message */
ReplyToTargetError(client, target_count);
return Plugin_Handled;
}
for (new i = 0; i < target_count; i++)
{
RespawnPlayer(client, target_list[i]);
}
ShowActivity2(client, "[SM] ", "Respawned target '%s'", target_name);
return Plugin_Handled;
}
static RespawnPlayer(client, player_id)
{
switch(GetClientTeam(player_id))
{
case 2:
{
new bool:canTeleport = SetTeleportEndPoint(client);
SDKCall(hRoundRespawn, player_id);
CheatCommand(player_id, "give", "first_aid_kit");
CheatCommand(player_id, "give", "smg");
if(canTeleport)
{
PerformTeleport(client,player_id,g_pos);
}
}
case 3:
{
decl String:game_name[24];
GetGameFolderName(game_name, sizeof(game_name));
if (StrEqual(game_name, "left4dead", false)) return;
SDKCall(hState_Transition, player_id, 8);
SDKCall(hBecomeGhost, player_id, 1);
SDKCall(hState_Transition, player_id, 6);
SDKCall(hBecomeGhost, player_id, 1);
}
}
}
public bool:TraceEntityFilterPlayer(entity, contentsMask)
{
return entity > MaxClients || !entity;
}
static bool:SetTeleportEndPoint(client)
{
decl Float:vAngles[3], Float:vOrigin[3];
GetClientEyePosition(client,vOrigin);
GetClientEyeAngles(client, vAngles);
//get endpoint for teleport
new Handle:trace = TR_TraceRayFilterEx(vOrigin, vAngles, MASK_SHOT, RayType_Infinite, TraceEntityFilterPlayer);
if(TR_DidHit(trace))
{
decl Float:vBuffer[3], Float:vStart[3];
TR_GetEndPosition(vStart, trace);
GetVectorDistance(vOrigin, vStart, false);
new Float:Distance = -35.0;
GetAngleVectors(vAngles, vBuffer, NULL_VECTOR, NULL_VECTOR);
g_pos[0] = vStart[0] + (vBuffer[0]*Distance);
g_pos[1] = vStart[1] + (vBuffer[1]*Distance);
g_pos[2] = vStart[2] + (vBuffer[2]*Distance);
}
else
{
PrintToChat(client, "[SM] %s", "Could not teleport player after respawn");
CloseHandle(trace);
return false;
}
CloseHandle(trace);
return true;
}
PerformTeleport(client, target, Float:pos[3])
{
pos[2]+=40.0;
TeleportEntity(target, pos, NULL_VECTOR, NULL_VECTOR);
LogAction(client,target, "\"%L\" teleported \"%L\" after respawning him" , client, target);
}
stock CheatCommand(client, String:command[], String:arguments[]="")
{
new userflags = GetUserFlagBits(client);
SetUserFlagBits(client, ADMFLAG_ROOT);
new flags = GetCommandFlags(command);
SetCommandFlags(command, flags & ~FCVAR_CHEAT);
FakeClientCommand(client, "%s %s", command, arguments);
SetCommandFlags(command, flags);
SetUserFlagBits(client, userflags);
}
// This file was auto-generated by SourceMod (v1.3.7-dev) // ConVars for plugin "sm_respawn.smx" // L4D(2) Respawn Version // - // Default: "2.0.1" l4d_sm_respawn_version "2.0.1" // 0:关闭; 1:复活玩家后给予药丸; 2:复活后给予肾上腺素 // - // Default: "0" // Minimum: "0.000000" // Maximum: "2.000000" respawn_give_medicine "2" // 0:关闭; 1:复活玩家后给予药包 // - // Default: "0" // Minimum: "0.000000" // Maximum: "1.000000" respawn_give_medkit "1"
在admin top menu 内显示复活/传送, 选择功能后, 会显示玩家清单以供复活或传送
smx插件放入:X:\left4dead2\addons\sourcemod\plugins
txt文件放入:X:\left4dead2\addons\sourcemod\gamedata
输入!admin 或/admin 显示之admin top menu (管理员管理选单)内,
会增加了一项 [复活/传送]
然后可选择 复活玩家 或 传送玩家
选择后会有一个在线玩家及电脑BOT清单
复活玩家: 任意地复活死去玩家或电脑BOT至管理员准星位置
传召玩家: 保留玩家身上装备地传送至管理员准星位置
移形换影: 将名单一的玩家传送至名单二身边, 选择后会先显示名单一, 然后名单二
新增 sm_respawn.cfg, 可修改参数如下:
// 0:关闭; 1:复活玩家后给予药丸; 2:复活后给予肾上腺素 // - // Default: "0" // Minimum: "0.000000" // Maximum: "2.000000" respawn_give_medicine "0" // 0:关闭; 1:复活玩家后给予药包 // - // Default: "0" // Minimum: "0.000000" // Maximum: "1.000000" respawn_give_medkit "0"
已知Bug:
假如选择者(管理员)复活自己会被传到地图之起点, 可用移形换影传回至同伴身边
管理员复活任何人(不包括自己), 都可复活至管理员之准星位置
下载地址:http://115.com/file/an480cyj,解压密码:fuck115!