AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting (https://forums.alliedmods.net/forumdisplay.php?f=107)
-   -   Simple Drop weapon (https://forums.alliedmods.net/showthread.php?t=143335)

Shouldercannon 11-18-2010 08:20

Simple Drop weapon
 
Помогите пожалуйста написать простейший код выброса оружия по событию
Please collect the aid of a simple code release arms on the event
PHP Code:

public Action:Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast

Так похоже бесполезно делать
So it seems useless to do
PHP Code:

...
new 
String:weapon[64];
...
GetEventString(event"weapon"weaponsizeof(weapon));
...
if (
StrContains("weapon_glock|weapon_usp|weapon_p228|weapon_deagle|weapon_fiveseven|weapon_elite"weapon) > -1)
// Бросить оружие/Drop weapon 


FaTony 11-18-2010 08:52

Re: Simple Drop weapon
 
Арррр... Нельзя так. StrContains ищет только одну строку. Тебе лучше всего Закинуть все "плохие" пушки в Trie и потом искать в ней. Пушку лучше всего бросать
OnPlayerRunCmd, добавив в битовую строку кпонок кнопку выброса пушки.

Как работать с Trie: http://docs.sourcemod.net/api/index....ad=file&id=46&

Как работать с OnPlayerRunCmd: http://forums.alliedmods.net/showthread.php?t=94187

Shouldercannon 11-18-2010 09:03

Re: Simple Drop weapon
 
Quote:

Originally Posted by FaTony (Post 1351810)
Арррр... Нельзя так. StrContains ищет только одну строку. Тебе лучше всего Закинуть все "плохие" пушки в Trie и потом искать в ней. Пушку лучше всего бросать
OnPlayerRunCmd, добавив в битовую строку кпонок кнопку выброса пушки.

Как работать с Trie: http://docs.sourcemod.net/api/index....ad=file&id=46&

Как работать с OnPlayerRunCmd: http://forums.alliedmods.net/showthread.php?t=94187

PHP Code:

if (StrContains("weapon_glock|weapon_usp|weapon_p228|weapon_deagle|weapon_fiveseven|weapon_elite"weapon) > -1

Это я использовал для отлова оружия, которым был убит игрок, чтобы вызвать соответсвующее действие. Если с Trie, можно будет сделать так же, то я буду только рад.

Дело в том, что плагин должен сам выбрасывать оружие. Нужно это для: если игрок атакует своих, то после трёх попаданий выбросить оружие, которым он наносит урон.

FaTony 11-19-2010 07:10

Re: Simple Drop weapon
 
Хоть одно оружие отловил? OnPlayerRunCmd "сам" выбросит пушку за игрока.

Shouldercannon 11-19-2010 07:49

Re: Simple Drop weapon
 
Quote:

Originally Posted by FaTony (Post 1352286)
Хоть одно оружие отловил? OnPlayerRunCmd "сам" выбросит пушку за игрока.

С помощью Trie? С OnPlayerRunCmd ни как не разберусь в плане выброса оружия.

FaTony 11-19-2010 14:05

Re: Simple Drop weapon
 
Нет, с помощью "пушка1|пушка2", т.к. такая штука не должна работать. Я лично советую держать весь код в OnPlayerRunCmd, хоты ты можешь его раскидать как хочешь. Кнопка добавляется вот так:
PHP Code:

buttons |= << n

Где n - значение смещения. Значение смещения ищется эмпирически (степень двойки, в которую надо возвести число, которое получается, когда ты нажимаешь кнопку выброса оружия).

Shouldercannon 11-19-2010 16:18

Re: Simple Drop weapon
 
Пытался выбросить всё оружие так
PHP Code:

#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

new Handle:hRemoveAllItems INVALID_HANDLE;
new 
Handle:hGameConf INVALID_HANDLE;
...
public 
OnPluginStart()
{
    
HookEvent("player_hurt"Event_PlayerHurt);

    
// Грузим нужные инструменты из файла
    
hGameConf LoadGameConfigFile("plugin.ut1999_sneers");

    
// Отвечает за drop оружия у игрока
    
StartPrepSDKCall(SDKCall_Player);
    
PrepSDKCall_SetFromConf(hGameConfSDKConf_Virtual"RemoveAllItems");
    
hRemoveAllItems EndPrepSDKCall();
}

public 
Action:Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
{
    new 
victimId GetEventInt(event"userid");
    new 
attackerId GetEventInt(event"attacker");
    
GetEventString(event"weapon"weaponnamesizeof(weaponname));
     
    new 
username GetClientOfUserId(victimId);
    
GetClientName(usernamevictimnamesizeof(victimname));
    new 
attacker GetClientOfUserId(attackerId);
    
// ===========================
    // Killed by the world. Suicide!
    // ===========================
    
if (attacker == 0
    {
        return;
    } 
    
GetClientName(attackerattackernamesizeof(attackername));

    
// Get Client "Victim"
    
new victimid GetClientOfUserId(GetEventInt(event"userid"));
    
// Get Client "Attacker"
    
new attackerid GetClientOfUserId(GetEventInt(event"attacker"));
    
// Get Victim's Team
    
new victimTeam GetClientTeam(victimid);
    
// Get Attacker's Team
    
new attackerTeam GetClientTeam(attackerid);

    
// ===========================
    // Огонь по своим
    // ===========================
    
if (victimTeam == attackerTeam)
    {
        if (
victimid != attackerid)
        {
            
RemoveAllPlayersWeapons(attackerid);
        }
    }
}

public 
RemoveAllPlayersWeapons(client)
{
    
SDKCall(hRemoveAllItemsclient);
    
//GivePlayerItem(client,"weapon_knife");


plugin.ut1999_sneers.txt
Code:

"Games"
{
        "cstrike"
        {
                "Offsets"
                {
                        "RemoveAllItems"
                        {
                                "windows"                "283"
                                "linux"                "284"
                        }
                }
        }
}

При первой же атаке игрока из своей команды сервер падает и не показывает перед этим никаких ошибок.

FaTony 11-19-2010 16:27

Re: Simple Drop weapon
 
Чего, чего, чего?

Shouldercannon 11-19-2010 17:03

Re: Simple Drop weapon
 
Quote:

Originally Posted by FaTony (Post 1352556)
Чего, чего, чего?

Непонял. Было сделано опираясь на Zombie Reloaded, если я не ошибаюсь.

Leonardo 11-20-2010 01:35

Re: Simple Drop weapon
 
pwnd

Shouldercannon 11-20-2010 01:47

Re: Simple Drop weapon
 
Тоесть данный способ обречён?

Leonardo 11-20-2010 03:09

Re: Simple Drop weapon
 
т.е. твой кодировка не позволять читать сообщение.

Shouldercannon 11-20-2010 03:47

Re: Simple Drop weapon
 
Quote:

Originally Posted by Leonardo (Post 1352779)
т.е. твой кодировка не позволять читать сообщение.

В браузере? UTF-8
V brauzere? UTF-8
In a browser? UTF-8

Вот нашёл способ.
Vot nashel sposob.
That found a way.
PHP Code:

public RemovePlayerWeapon(client)
{    
    
FakeClientCommandEx(client,"drop");
    
PrintToServer("Caught");


Надеюсь у него нет фатальных недостатков, кроме невозможности выкинуть нож, хотя этого делать и не надо.
Nadeus' u nego net fatal'nih nedostatkov, krome nevozmojnosti vikinut' noj, hotya etogo delat' i ne nado.
I hope he does not have fatal flaws, but can not throw a knife, although do not have to.

Leonardo 11-20-2010 03:57

Re: Simple Drop weapon
 
son of a witch! say that in english! and use Edit button.

EDIT:
1/ разумеется в браузере. однако кодировка здесь - ISO-8859-1
2/ хватит переводить гуглом/промтом/etc.
вот теперь начну разбирать все, что написал.

EDIT2:
путем поиска по drop weapon легко бы сам нашел плагин и препарировал его
PHP Code:

#pragma semicolon 1

#include <sourcemod>
#include <sdktools>

new Handle:hDrop INVALID_HANDLE;

public 
OnPluginStart()
{
    
StartPrepSDKCall(SDKCall_Player);
    
PrepSDKCall_SetFromConf(hGameConfSDKConf_Virtual"Weapon_Drop");
    
PrepSDKCall_AddParameter(SDKType_CBaseEntitySDKPass_Pointer);
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);
    if ((
hDrop EndPrepSDKCall()) == INVALID_HANDLE)
        
PrintToServer("[Advanced Commands] Warning: Weapon_Drop SDKCall not found, stupid method will be used");
}

DropWeapon(client,ent// ent - number of valid entity
{
    if (
hDrop != INVALID_HANDLE)
        
SDKCall(hDrop,client,ent,0,0);
    else
    {
        
decl String:edict[MAX_NAME];
        
GetEdictClassname(ent,edict,sizeof(edict));
        
FakeClientCommandEx(client,"use %s;drop",edict);
    }


выводы делай сам.

Shouldercannon 11-20-2010 11:38

Re: Simple Drop weapon
 
Не понимаю
PHP Code:

new Handle:hDrop INVALID_HANDLE;
new 
Handle:hGameConf INVALID_HANDLE;
...
public 
OnPluginStart()
{    
hGameConf LoadGameConfigFile("advcommands.gamedata");
    
    
StartPrepSDKCall(SDKCall_Player); 
    
PrepSDKCall_SetFromConf(hGameConfSDKConf_Virtual"Weapon_Drop"); 
    
PrepSDKCall_AddParameter(SDKType_CBaseEntitySDKPass_Pointer); 
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer); 
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer); 
    if ((
hDrop EndPrepSDKCall()) == INVALID_HANDLE
    
PrintToServer("[Advanced Commands] Warning: Weapon_Drop SDKCall not found, stupid method will be used");
}

stock DropWeapon(clientent// ent - number of valid entity 

    if (
hDrop != INVALID_HANDLE
        
SDKCall(hDropclientent0,0);
    else 
    { 
        
decl String:edict[MAX_NAME]; 
        
GetEdictClassname(ent,edictsizeof(edict)); 
        
FakeClientCommandEx(client"use %s;drop"edict); 
    } 


На строке PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "Weapon_Drop");
Предупреждение при компиляции
warning 217: loose indentation
Какой-то идентификатор потерян.

P.S. Теперь нормальная кодировка?

Leonardo 11-20-2010 11:58

Re: Simple Drop weapon
 
right

warning 217: loose indentation
означает возможную ошибку в логике
в конструкциях if/for/foreach или функциях без указания фигурных скобок
например
Code:

if(условие1)
  if(условие2)
      результат2
else
  результат3

оно поймет как
Code:

if(условие1)
{
  if(условие2)
  {
      результат2
  }
  else
  {
      результат3
  }
}

но выдаст предупреждение о неверной расстановке отступов.
так же микс из табуляций и наборов пробелов в начале строк
(в некоторых строках в начале табуляции, в некоторых - пробелы)
оно тоже не поймет, что то зафэилит.

ps: советую пользоваться нормальным Notepad++

Shouldercannon 11-20-2010 12:35

Re: Simple Drop weapon
 
Ничего такого нет. Так всё нормально
PHP Code:

public OnPluginStart() 
{
    
StartPrepSDKCall(SDKCall_Player);  
    
PrepSDKCall_SetFromConf(hGameConfSDKConf_Virtual"Weapon_Drop");  
    
PrepSDKCall_AddParameter(SDKType_CBaseEntitySDKPass_Pointer);  
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);  
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);  
    if ((
hDrop EndPrepSDKCall()) == INVALID_HANDLE)  
    
PrintToServer("[Advanced Commands] Warning: Weapon_Drop SDKCall not found, stupid method will be used"); 


Но стоит добавить что-нибудь вверх или вниз, то сразу начинается loose indentation. Ещё плагин при перезагрузке выдаёт [Advanced Commands] Warning: Weapon_Drop SDKCall not found, stupid method will be used. Похоже дело совсем плохо.

Leonardo 11-20-2010 12:41

Re: Simple Drop weapon
 
в строке после if нужно добавить еще отступ (хер знает, чем он у тебя, пробелами или табуляциями)
если все равно выдает "Weapon_Drop SDKCall not found" (при наличии "advcommands.gamedata" в папке gamedata), то значит - дело труба :3

Shouldercannon 11-20-2010 12:53

Re: Simple Drop weapon
 
Сделал вот так
PHP Code:

/* Plugin Template generated by Pawn Studio */

#include <sourcemod> 
#include <sdktools>

new Handle:hDrop INVALID_HANDLE
new 
Handle:hGameConf INVALID_HANDLE;

public 
Plugin:myinfo 
{
    
name "_New Plugin_",
    
author "Unknown",
    
description "<- Description ->",
    
version "1.0",
    
url "<- URL ->"
}

public 
OnPluginStart() 
{    
    
hGameConf LoadGameConfigFile("advcommands.gamedata");
    {
        
StartPrepSDKCall(SDKCall_Player);
        
PrepSDKCall_SetFromConf(hGameConfSDKConf_Virtual"Weapon_Drop");
        
PrepSDKCall_AddParameter(SDKType_CBaseEntitySDKPass_Pointer);
        
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);
        
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);
        if ((
hDrop EndPrepSDKCall()) == INVALID_HANDLE)
        
PrintToServer("[Advanced Commands] Warning: Weapon_Drop SDKCall not found, stupid method will be used");
    }
}

DropWeapon(client,ent// ent - number of valid entity
{
    if (
hDrop != INVALID_HANDLE)
        
SDKCall(hDrop,client,ent,0,0);
    else
    {
        
decl String:edict[MAX_NAME];
        
GetEdictClassname(ent,edict,sizeof(edict));
        
FakeClientCommandEx(client,"use %s;drop",edict);
    }


Единственное предупреждение (43) : warning 203: symbol is never used: "DropWeapon", но 43 это пустота (самый конец плагина). Сновой верией advcommands.gamedata была ошибка [Advanced Commands] Warning: Weapon_Drop SDKCall not found, stupid method will be used., со старой нет такого.

Теперь из нужного блока, нужно обратиться к DropWeapon со значениями client и ent полученными взаранее?

Leonardo 11-20-2010 13:03

Re: Simple Drop weapon
 
1 Attachment(s)
right.

Shouldercannon 11-20-2010 13:14

Re: Simple Drop weapon
 
Quote:

Originally Posted by Leonardo (Post 1353075)
right.

Спасибо. Зачётно.
PHP Code:

DropWeapon(client,ent

Тут надо передать client - ID игрока, ent - номер слота, в котором оружие.
Потом походу через GetEdictClassname мы получаем само название оружия?

Leonardo 11-20-2010 13:35

Re: Simple Drop weapon
 
которое потом используем в команде use, чтобы его выбрать и выбросить.
ID имеется ввиду Client's ID (instead of UserID)
ent - номер оружия (глобальный номер), не слот.

Shouldercannon 11-20-2010 13:54

Re: Simple Drop weapon
 
ID получаю так
PHP Code:

    // Получаем ID атакующего
    
new attackerid GetClientOfUserId(GetEventInt(event"attacker")); 

С получением глобальн номера оружия запара. Нашёл только
PHP Code:

GetPlayerWeaponSlot 


FaTony 11-20-2010 14:01

Re: Simple Drop weapon
 
В нетпропах скорее всего есть. Можно, конечно, пойти по всем объектам и смотреть m_hOwnerEntity.

Leonardo 11-20-2010 14:49

Re: Simple Drop weapon
 
в том плагине adv commands использовался GetPlayerWeaponSlot

и если плагин будет в списке на релиз, не смей в нем оставлять русский. где бы то ни было

Shouldercannon 11-20-2010 15:00

Re: Simple Drop weapon
 
PHP Code:

new ent GetPlayerWeaponSlot(clientslot); 

какого типа будет переменная slot и что в неё записывать?
В adv commands видел пример с бомбой, но это конкретный вид оружия.

Leonardo 11-20-2010 15:04

Re: Simple Drop weapon
 
integer. зависит от того, что ты хочешь выкинуть. 0 - нож. 1 - пистолет. 2 - пулемет/(полу)автомат/дробовик/винтовка. 3 - гранаты. 4 - набор для разминирования/бомба

если нужно выбросить все, сразу бы и сказал.

FaTony 11-20-2010 15:04

Re: Simple Drop weapon
 
Тип Cell. Записывать индекс слота...

Shouldercannon 11-20-2010 15:11

Re: Simple Drop weapon
 
PHP Code:

stock DropWeapon(client,ent)

    if (
hDrop != INVALID_HANDLE)
        
SDKCall(hDrop,client,ent,0,0);
    else
    {
        
decl String:edict[MAX_NAME]; // Что это такое?
        
GetEdictClassname(ent,edict,sizeof(edict));
        
FakeClientCommandEx(client,"use %s;drop",edict);
    }


Похоже после else идёт лишнее или оно нужно?

Leonardo 11-20-2010 15:16

Re: Simple Drop weapon
 
если sdkcall сработал, то лишнее, иначе - нужное.

Shouldercannon 11-20-2010 15:28

Re: Simple Drop weapon
 
Можно выбросить всё оружие. так лучше будет.
PHP Code:

[MAX_NAME

вызывает ошибку при компиляции
error 017: undefined symbol "MAX_NAME"
пока без блока идущего после else
в кносоле появляются ошибки
Code:

L 11/20/2010 - 23:15:05: [SM] Native "SDKCall" reported: NULL not allowed
L 11/20/2010 - 23:15:05: [SM] Displaying call stack trace for plugin "test.smx":
L 11/20/2010 - 23:15:05: [SM]  [0]  Line 51, D:\Main\Counter-Strike Source Zombie Reloaded\orangebox\cstrike\addons\sourcemod\scripting\test.sp::DropWeapon()
L 11/20/2010 - 23:15:05: [SM]  [1]  Line 45, D:\Main\Counter-Strike Source Zombie Reloaded\orangebox\cstrike\addons\sourcemod\scripting\test.sp::Event_PlayerHurt()

пытаюсь выкинуть пистолет при атаке своих

Сами линии
PHP Code:

Line 51, &#1082;ода нет (пустота)
Line 45stock DropWeapon(client,ent


Leonardo 11-20-2010 15:52

Re: Simple Drop weapon
 
справочные материалы доступны. все плагины с исходным кодом. в наше время даже переводчик бесплатный доступен. ну подумай хоть немного.

FaTony 11-20-2010 16:02

Re: Simple Drop weapon
 
Тут пока код рабочий не напишешь и не разжуёшь, ничего хорошего не выйдет. Имхо, если нужно пушки из игры совсем удалить, то лучше вообще без SDKCall'ов, т.к. тут похоже никто не собирается оффсеты подправлять при каждом обновлении. Собственно, если пушка выбрасывается командой "drop" (я под css не писал), то тут тоже по большому счёту SDKCall не нужен.

Shouldercannon 11-20-2010 16:09

Re: Simple Drop weapon
 
Разрулил (MAX_NAME - это #define MAX_NAME 64)
PHP Code:

#include <sourcemod>
#include <sdktools>

#define MAX_NAME 64

new Handle:hDrop INVALID_HANDLE;
new 
Handle:hGameConf INVALID_HANDLE;

public 
Plugin:myinfo 
{
    
name "_New Plugin_",
    
author "Unknown",
    
description "<- Description ->",
    
version "1.0",
    
url "<- URL ->"
}

public 
OnPluginStart()
{
    
HookEvent("player_hurt"Event_PlayerHurt);
    
    
hGameConf LoadGameConfigFile("ut1999_sneers");
    
StartPrepSDKCall(SDKCall_Player);
    
PrepSDKCall_SetFromConf(hGameConfSDKConf_Virtual"Weapon_Drop");
    
PrepSDKCall_AddParameter(SDKType_CBaseEntitySDKPass_Pointer);
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);
    
PrepSDKCall_AddParameter(SDKType_VectorSDKPass_Pointer);
    if((
hDrop EndPrepSDKCall()) == INVALID_HANDLE)
        
PrintToServer("[Debug] Weapon_Drop SDKCall not found, stupid method will be used");
}

public 
Action:Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
{
    new 
attackerid GetClientOfUserId(GetEventInt(event"attacker"));    
    new 
ent GetPlayerWeaponSlot(attackerid2); // Выбросить нож
    
DropWeapon(attackerident); // Point 2
           // Полагаю, что проверку надо сделать здесь и задействовать return. Могу ошибаться.
}

stock DropWeapon(client,ent)

    if (
hDrop != INVALID_HANDLE)
        
SDKCall(hDropclientent0,0); // Point 1
    
else
    {
        
decl String:edict[MAX_NAME];
        
GetEdictClassname(ent,edict,sizeof(edict));
        
FakeClientCommandEx(client,"use %s;drop",edict);
    }


Если оружие уже выброшено и плагин пытается выкинуть его снова то возникают ошибки (Point 1, Point 2)
Как выбросить сразу всё оружие (нож; пистолеты; основное оружие)

Leonardo 11-20-2010 17:19

Re: Simple Drop weapon
 
дюд
ставь цели заранее
если при ранении своего нужно пушку ронять
то
PHP Code:

public OnPluginStart()
    
HookEvent("player_hurt"Event_PlayerHurtEventHookMode_Pre);

public 
OnPluginEnd()
    
UnhookEvent("player_hurt"Event_PlayerHurtEventHookMode_Pre);

public 
Action:Event_PlayerHurt(Handle:hEvent, const String:sName[], bool:bDontBroadcast)
{
    new 
iAttacker GetClientOfUserId(GetEventInt(hEvent"attacker"));
    new 
iVictim GetClientOfUserId(GetEventInt(hEvent"userid"));
    if( 
iAttacker<=|| iAttacker>MaxClients || iVictim<=|| iVictim>MaxClients
        
|| !IsClientInGame(iAttacker) || !IsClientInGame(iVictim) || !IsPlayerAlive(iAttacker
        || 
GetClientTeam(iAttacker)<=|| GetClientTeam(iVictim)<=)
        return 
Plugin_Continue;
    if( 
GetClientTeam(iVictim)==GetClientTeam(iAttacker) )
        
FakeClientCommand(iAttacker"drop");
    return 
Plugin_Continue;



Shouldercannon 11-21-2010 02:14

Re: Simple Drop weapon
 
Реально сделаю как было раньше, а то слишком много проблем
PHP Code:

FakeClientCommand(client,"drop"); 

без FakeClientCommandEx. Пусть даже alias будет на drop, всёравно после четвёртого попадания убью игрока :)


All times are GMT -4. The time now is 02:04.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.