Русское сообщество по скриптингу

Телепортация игрока к другому

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Телепортация игрока к другому

Сообщение ArKaNeMaN » 14 май 2017, 13:18

Люди, привет...
Мне нужно как то телепортировать игрока к другому игроку та что бы он не застрял... я пытался что то сделать, но у меня как всегда всё идёт через жопу и крашит сервер

Код: Выделить всё

        static random
; random = random_num(1,2)
        switch(random){
            case 1:{
                static origin[3];
                get_user_origin(i_T, origin, 0);
                static bool:vacant; vacant = false;
                while(!vacant){
                    static random1; random_num(1, 2);
                    static o_plus;
                    switch(random1){
                        case 1:{
                            o_plus = 30;
                        }
                        case 2:{
                            o_plus = -30;
                        }
                    }
                    static Float:origin_test[3]
                    for(new i = 1; i<=2; i++){
                        origin_test[i] = float(origin[i]);
                    }
                    static random2; random_num(0, 2);
                    switch(random2){
                        case 0:{
                            origin_test[random2] += o_plus;
                        }
                        case 2:{
                            origin_test[random2] += o_plus;
                        }
                    }
                    if(is_hull_vacant(origin_test, HULL_HUMAN)){
                        vacant = true;
                        for(new i = 1; i<=2; i++){
                            origin[i] = floatround(origin_test[i], floatround_round);
                        }
                    }
                }
                set_user_origin(i_Ct, origin);
            }
            case 2:{
                static origin[3];
                get_user_origin(i_Ct, origin, 0);
                static bool:vacant; vacant = false;
                while(!vacant){
                    static random1; random_num(1, 2);
                    static o_plus;
                    switch(random1){
                        case 1:{
                            o_plus = 30;
                        }
                        case 2:{
                            o_plus = -30;
                        }
                    }
                    static Float:origin_test[3]
                    for(new i = 1; i<=2; i++){
                        origin_test[i] = float(origin[i]);
                    }
                    static random2; random_num(0, 2);
                    switch(random2){
                        case 0:{
                            origin_test[random2] += o_plus;
                        }
                        case 2:{
                            origin_test[random2] += o_plus;
                        }
                    }
                    if(is_hull_vacant(origin_test, HULL_HUMAN)){
                        vacant = true;
                        for(new i = 1; i<=2; i++){
                            origin[i] = floatround(origin_test[i], floatround_round);
                        }
                    }
                }
                set_user_origin(i_T, origin);
            }
        }


Тут телепортирует(нет) i_T к i_Ct или наоборот
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: Телепортация игрока к другому

Сообщение Mistrick » 14 май 2017, 13:29

Пробуй вытащить. Тут есть код телепорта за спину другого игрока.
Код: Выделить всё
/**
 * Invis t
 * blink for t - done
 * throwing knives for t
 * 120* sec for kill all ct
 * block pick up weapons for ct
 * add sounds, effects for blink
 * invul for t and tp to ct spawn
 * 
 */
#include <amxmodx>
#include <engine>
#include <cstrike>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <deathrun_modes>
#include <xs>

#pragma semicolon 1

#define PLUGIN "Deathrun Mode: Spy"
#define VERSION "0.1"
#define AUTHOR "Mistrick"

#define IsPlayer(%1) (%1 && %1 <= g_iMaxPlayers)

#define BLINK_DELAY 5.0

new g_iCurModeg_iModeSpyg_iMaxPlayers;
new 
Float:g_fLastUse[33];

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);
    
    
RegisterHam(Ham_Player_PreThink"player""Ham_PlayerPreThink_Pre"false);
    
    
g_iModeSpy dr_register_mode
    
(
        .
Name "DRM_MODE_SPY",
        .
Mark "spy",
        .
RoundDelay 0,
        .
CT_BlockWeapons 1,
        .
TT_BlockWeapons 1,
        .
CT_BlockButtons 0,
        .
TT_BlockButtons 1,
        .
Bhop 1,
        .
Usp 0,
        .
Hide 0
    
);
    
    
g_iMaxPlayers get_maxplayers();
}
public 
Ham_PlayerPreThink_Pre(id)
{
    if(!
is_user_alive(id)) return HAM_IGNORED;
    
    new 
Float:gametime get_gametime();
    
    if(
gametime g_fLastUse[id] + BLINK_DELAY) return HAM_IGNORED;
    
    new 
buttons pev(idpev_button);
    new 
oldbuttons pev(idpev_oldbuttons);
    
    if(
buttons IN_USE && ~oldbuttons IN_USE)
    {
        new 
targetbodyget_user_aiming(idtargetbody);
        
        if(!
IsPlayer(target)) return HAM_IGNORED;
        
        new 
Float:origin[3]; get_front_origin(target, -48.0origin);
        
set_pev(idpev_originorigin);
        new 
Float:vangles[3]; pev(targetpev_v_anglevangles);
        
set_pev(idpev_v_anglevangles);
        
set_pev(idpev_anglesvangles);
        
set_pev(idpev_fixangle1);
        
        
CheckStuck(id);
        
        
g_fLastUse[id] = gametime;
    }
    
    return 
HAM_IGNORED;
}
public 
dr_selected_mode(idmode)
{
    
g_iCurMode mode;
    
    if(
mode == g_iModeSpy)
    {
        
    }
}
CheckStuck(id)
{
    static const 
Float:g_flMoves[][3] =
    {
        {
0.0,0.0,1.0},{0.0,0.0,-1.0},{0.0,1.0,0.0},{0.0,-1.0,0.0},{1.0,0.0,0.0},{-1.0,0.0,0.0},{-1.0,1.0,1.0},{1.0,1.0,1.0},{1.0,-1.0,1.0},{1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,-1.0},
        {
0.0,0.0,2.0},{0.0,0.0,-2.0},{0.0,2.0,0.0},{0.0,-2.0,0.0},{2.0,0.0,0.0},{-2.0,0.0,0.0},{-2.0,2.0,2.0},{2.0,2.0,2.0},{2.0,-2.0,2.0},{2.0,2.0,-2.0},{-2.0,-2.0,2.0},{2.0,-2.0,-2.0},{-2.0,2.0,-2.0},{-2.0,-2.0,-2.0},
        {
0.0,0.0,3.0},{0.0,0.0,-3.0},{0.0,3.0,0.0},{0.0,-3.0,0.0},{3.0,0.0,0.0},{-3.0,0.0,0.0},{-3.0,3.0,3.0},{3.0,3.0,3.0},{3.0,-3.0,3.0},{3.0,3.0,-3.0},{-3.0,-3.0,3.0},{3.0,-3.0,-3.0},{-3.0,3.0,-3.0},{-3.0,-3.0,-3.0},
        {
0.0,0.0,4.0},{0.0,0.0,-4.0},{0.0,4.0,0.0},{0.0,-4.0,0.0},{4.0,0.0,0.0},{-4.0,0.0,0.0},{-4.0,4.0,4.0},{4.0,4.0,4.0},{4.0,-4.0,4.0},{4.0,4.0,-4.0},{-4.0,-4.0,4.0},{4.0,-4.0,-4.0},{-4.0,4.0,-4.0},{-4.0,-4.0,-4.0},
        {
0.0,0.0,5.0},{0.0,0.0,-5.0},{0.0,5.0,0.0},{0.0,-5.0,0.0},{5.0,0.0,0.0},{-5.0,0.0,0.0},{-5.0,5.0,5.0},{5.0,5.0,5.0},{5.0,-5.0,5.0},{5.0,5.0,-5.0},{-5.0,-5.0,5.0},{5.0,-5.0,-5.0},{-5.0,5.0,-5.0},{-5.0,-5.0,-5.0}
    };
    
    new 
iflagsFloat:vOrigin[3], Float:vNewOrigin[3], Float:vMins[3];
    
flags pev(idpev_flags);
    
pev(idpev_originvOrigin);
    if(
is_user_stuck(idvOriginflags))
    {
        
pev(idpev_minsvMins);
        for(
0sizeof(g_flMoves); i++)
        {
            
vNewOrigin[0] = vOrigin[0] - vMins[0] * g_flMoves[i][0];
            
vNewOrigin[1] = vOrigin[1] - vMins[1] * g_flMoves[i][1];
            
vNewOrigin[2] = vOrigin[2] - vMins[2] * g_flMoves[i][2];
            if(!
is_user_stuck(idvNewOriginflags))
            {
                
set_pev(idpev_velocityFloat:{0.00.0 0.0});
                
set_pev(idpev_flagsflags FL_DUCKING);
                
set_pev(idpev_sizeFloat:{-16.0, -16.0, -18.0}, Float:{16.016.018.0});
                
set_pev(idpev_originvNewOrigin);
                break;
            }
        }
    }
}
stock bool:is_user_stuck(const id, const Float:vOrigin[3], const flags)
{
    return 
bool:(trace_hull(vOriginflags FL_DUCKING HULL_HEAD HULL_HUMANidIGNORE_MONSTERS) & 2);
}
stock get_front_origin(idFloat:distFloat:origin[3])
{    
    new 
iVectorStart[3]; get_user_origin(idiVectorStart1);
    new 
iVectorEnd[3]; get_user_origin(idiVectorEnd3);
    new 
Float:fVectorStart[3]; IVecFVec(iVectorStartfVectorStart);
    new 
Float:fVectorEnd[3]; IVecFVec(iVectorEndfVectorEnd);
    
    new 
Float:fAddVec[3]; xs_vec_sub(fVectorEndfVectorStartfAddVec);
    
fAddVec[2] = 0.0;
    
xs_vec_normalize(fAddVecfAddVec);
    
xs_vec_mul_scalar(fAddVecdistfAddVec);
    
    
pev(idpev_originorigin);
    
xs_vec_add(originfAddVecorigin);
}
 
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Телепортация игрока к другому

Сообщение ArKaNeMaN » 14 май 2017, 15:14

Вот что получилось....

Код: Выделить всё
static randomi_telei_targetrandom random_num(1,2)
        switch(
random){
            case 
1:{
                
i_tele i_Ct
                i_target 
i_T
            
}
            case 
2:{
                
i_tele i_T
                i_target 
i_Ct
            
}
        }
        new 
Float:origin[3]; get_front_origin(i_target, -48.0origin);
        
set_pev(i_telepev_originorigin);
        new 
Float:vangles[3]; pev(i_targetpev_v_anglevangles);
        
set_pev(i_telepev_v_anglevangles);
        
set_pev(i_telepev_anglesvangles);
        
set_pev(i_telepev_fixangle1);
        
        
CheckStuck(id);
 

Код: Выделить всё

CheckStuck
(id){
    static const Float:g_flMoves[][3] =
    {
        {0.0,0.0,1.0},{0.0,0.0,-1.0},{0.0,1.0,0.0},{0.0,-1.0,0.0},{1.0,0.0,0.0},{-1.0,0.0,0.0},{-1.0,1.0,1.0},{1.0,1.0,1.0},{1.0,-1.0,1.0},{1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,-1.0},
        {0.0,0.0,2.0},{0.0,0.0,-2.0},{0.0,2.0,0.0},{0.0,-2.0,0.0},{2.0,0.0,0.0},{-2.0,0.0,0.0},{-2.0,2.0,2.0},{2.0,2.0,2.0},{2.0,-2.0,2.0},{2.0,2.0,-2.0},{-2.0,-2.0,2.0},{2.0,-2.0,-2.0},{-2.0,2.0,-2.0},{-2.0,-2.0,-2.0},
        {0.0,0.0,3.0},{0.0,0.0,-3.0},{0.0,3.0,0.0},{0.0,-3.0,0.0},{3.0,0.0,0.0},{-3.0,0.0,0.0},{-3.0,3.0,3.0},{3.0,3.0,3.0},{3.0,-3.0,3.0},{3.0,3.0,-3.0},{-3.0,-3.0,3.0},{3.0,-3.0,-3.0},{-3.0,3.0,-3.0},{-3.0,-3.0,-3.0},
        {0.0,0.0,4.0},{0.0,0.0,-4.0},{0.0,4.0,0.0},{0.0,-4.0,0.0},{4.0,0.0,0.0},{-4.0,0.0,0.0},{-4.0,4.0,4.0},{4.0,4.0,4.0},{4.0,-4.0,4.0},{4.0,4.0,-4.0},{-4.0,-4.0,4.0},{4.0,-4.0,-4.0},{-4.0,4.0,-4.0},{-4.0,-4.0,-4.0},
        {0.0,0.0,5.0},{0.0,0.0,-5.0},{0.0,5.0,0.0},{0.0,-5.0,0.0},{5.0,0.0,0.0},{-5.0,0.0,0.0},{-5.0,5.0,5.0},{5.0,5.0,5.0},{5.0,-5.0,5.0},{5.0,5.0,-5.0},{-5.0,-5.0,5.0},{5.0,-5.0,-5.0},{-5.0,5.0,-5.0},{-5.0,-5.0,-5.0}
    };
    
    new i
, flags, Float:vOrigin[3], Float:vNewOrigin[3], Float:vMins[3];
    flags = pev(id, pev_flags);
    pev(id, pev_origin, vOrigin);
    if(is_user_stuck(id, vOrigin, flags))
    {
        pev(id, pev_mins, vMins);
        for(= 0; i < sizeof(g_flMoves); i++)
        {
            vNewOrigin[0] = vOrigin[0] - vMins[0] * g_flMoves[i][0];
            vNewOrigin[1] = vOrigin[1] - vMins[1] * g_flMoves[i][1];
            vNewOrigin[2] = vOrigin[2] - vMins[2] * g_flMoves[i][2];
            if(!is_user_stuck(id, vNewOrigin, flags))
            {
                set_pev(id, pev_velocity, Float:{0.0, 0.0 , 0.0});
                set_pev(id, pev_flags, flags | FL_DUCKING);
                set_pev(id, pev_size, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 18.0});
                set_pev(id, pev_origin, vNewOrigin);
                break;
            }
        }
    }
}
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: Телепортация игрока к другому

Сообщение D34by » 14 май 2017, 15:34

Перемещать нужно через
Код: Выделить всё
EngFunc_SetOrigin

Допустим при циклировании и перемещении игрока через pev_origin хул будет считать, что там никого нет, а это чревато последствиями
Work with Zombie Plague ver. 4|5, Biohazard, Zombie Engine, Public, Weapon System
Аватара пользователя
D34by
 
Сообщения: 537
Зарегистрирован: 13 фев 2014, 12:45
Благодарил (а): 15 раз.
Поблагодарили: 192 раз.
Опыт программирования: Больше трех лет
Языки программирования: пешка
сишка

Re: Телепортация игрока к другому

Сообщение ArKaNeMaN » 14 май 2017, 17:38

Ну... я такое где то видел... но вот проблема... я не знаю куда это тут впихнуть XDD

Добавлено спустя 1 час 33 минуты 51 секунду:
Оно как бы работает... но всё равно есть моменты когда игрок застревает в стене..
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 13