Вопросы по: MySql/Sql & Логике & EmitSound & Координаты

Тема в разделе "Программирование / Скриптинг", создана пользователем Саша Шеин, 22 окт 2015.

  1. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Всем привет!

    Вопрос №1:
    Как это сделать для MySql:
    SaveClient(client)
    PHP:
    SaveClient(client)
    {
        if (
    client && !IsFakeClient(client) && !IsClientSourceTV(client))
        {
            
    decl String:sQuery[250];
            
    GetClientAuthString(clientsQuery32);
            
    Format(sQuerysizeof(sQuery), "UPDATE new_mod_table SET `exp` = '%d', `kills` = '%d', `deaths` = '%d', `level` = '%d',`credits` = '%d' WHERE `steamid`='%s' LIMIT 1",g_iExp[client],g_iKills[client],g_iDeaths[client],g_iLevel[client],g_iCredits[client], sQuery);
            
    SQL_TQuery(g_hSQLSQLT_OnClientSavesQueryGetClientUserId(client));
        }
    }
    public 
    SQLT_OnClientSave(Handle:hOwnerHandle:hQuery, const String:sError[], any:iUserId)
    {
        new 
    iClient GetClientOfUserId(iUserId);
        if (!
    iClient)
        {
            return;
        }
        
        if (!
    hQuery)
        {
            
    LogError("SQLT_OnInsertClient: %s"sError);
        }
        
    g_bIsLoad[iClient] = false;
    }

    Вопрос №2:
    Какой будет этот код для MySql:
    OnClientLoad(client)
    PHP:
    OnClientLoad(client)
    {
        if (
    client && !IsFakeClient(client) && !IsClientSourceTV(client))
        {
            
    decl String:sQuery[250];
            
    GetClientAuthString(clientsQuery32);
            
    Format(sQuerysizeof(sQuery), "SELECT `exp`, `kills`, `deaths`, `level`,`credits` FROM `new_mod_table` WHERE `steamid`='%s' LIMIT 1"sQuery);
            
    SQL_TQuery(g_hSQLSQLT_OnClientPutInServersQueryGetClientUserId(client));
        }
    }

    public 
    SQLT_OnClientPutInServer(Handle:hOwnerHandle:hQuery, const String:sError[], any:iUserId)
    {
        new 
    iClient GetClientOfUserId(iUserId);
        if (!
    iClient)
        {
            return;
        }
        
        if (!
    hQuery)
        {
            
    LogError("SQLT_OnClientPutInServer: %s"sError);
            
    g_bIsLoad[iClient] = false;
        }
        
        if (
    SQL_FetchRow(hQuery))
        {
            
    g_iExp[iClient] = SQL_FetchInt(hQuery0);
            
    g_iKills[iClient] = SQL_FetchInt(hQuery1);
            
    g_iDeaths[iClient] = SQL_FetchInt(hQuery2);
            
    g_iLevel[iClient] = SQL_FetchInt(hQuery3);
            
    g_iCredits[iClient] = SQL_FetchInt(hQuery4);
            
    g_bIsLoad[iClient] = true;
        }
        else
        {
            
    decl String:sQuery[250];
            
    GetClientAuthString(iClientsQuery32);
            
    Format(sQuery650"INSERT INTO `new_mod_table` (`exp`,`kills`,`deaths`,`level`,`credits`,`steamid`) VALUES (0,0,0,1,0,'%s')"sQuery);
            
    SQL_TQuery(g_hSQLSQLT_OnInsertClientsQueryGetClientUserId(iClient));
        }
    }
    public 
    SQLT_OnInsertClient(Handle:hOwnerHandle:hQuery, const String:sError[], any:iUserId)
    {
        new 
    iClient GetClientOfUserId(iUserId);
        if (!
    iClient)
        {
            return;
        }
        
        if (!
    hQuery)
        {
            
    LogError("SQLT_OnInsertClient: %s"sError);
            
    g_bIsLoad[iClient] = false;
        }
        
    g_bIsLoad[iClient] = true;
        
    g_iExp[iClient] = g_iExpStart;
        
    g_iKills[iClient] = 0;
        
    g_iDeaths[iClient] = 0;
        
    g_iLevel[iClient] = 1;
        
    g_iCredits[iClient] = g_iCreditsStart;
    }

    Вопрос №3:
    Как воспроизвести звук (acegamer/pain/men/pain04.mp3) в радиусе от игрока и чем дальше тем тише.
    PHP:
                    new Float:pos_c[3], String:buf[256];
                    
    GetClientAbsOrigin(clientFloat:pos_c);

                    for(new 
    i=1;i<=MaxClients;i++)
                    {
                        if(
    IsClientInGame(i) && IsPlayerAlive(i))
                            
    EmitAmbientSound("acegamer/pain/men/pain04.mp3" Float:pos_cclientSNDLEVEL_CONVO );
                    }
    Вопрос №4:
    Почему не добавляет g_iCredits , g_iLevel , g_iExp ? Вроде всё правильно сделал.
    PHP:
    /*
    "userid"    "short"       // user ID who died                
    "attacker"    "short"         // user ID who killed
    "weapon"    "string"     // weapon name killer used 
    "headshot"    "bool"        // signals a headshot
    */
    public Action:EV_Death(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event,"userid")),
            
    attacker GetClientOfUserId(GetEventInt(event"attacker"));
            
        if(
    client && attacker /*&& !IsFakeClient(client) && !IsFakeClient(attacker)*/)
        {
            new 
    bHead GetEventBool(event,"headshot");
            
            
    g_iKills[attacker]++;
            
    g_iDeaths[client]++;
            
            
    g_iCredits[attacker]=g_iCredits[attacker]+((bHead)?g_iCreditsHead:g_iCreditsKill);
            
            new 
    newxp=g_iExp[attacker]+((bHead)?g_iExpHead:g_iExpKill);
            if(
    newxp>=(g_iLevel[attacker]*g_iExpInc))
            {
                
                new 
    newlevel=0;
                new 
    reqxp g_iLevel[attacker]*g_iExpInc;
                while(
    g_iExp[attacker]>reqxp)
                {
                    
    newxp-=reqxp;
                    
    newlevel g_iLevel[attacker] + 1;
                }
                
    // while(newxp<0)
                // {
                    // g_iLevel[attacker]-=1;
                    // newxp=reqxp-g_iExpInc-newxp;
                // }
                
    g_iLevel[attacker] = newlevel;
                
    g_iExp[attacker] = newxp;
                
    PrintToChat(attacker,"[New Mod] Вы получили:");
                
    PrintToChat(attacker,"Новый уровень %d",g_iLevel[attacker]);
                
    PrintToChat(attacker,"Теперь у вас %d EXP",g_iExp[attacker]);
            }
        }
    }

    P.S. Знаю что вопросы глупые и наверняка есть ответы в сети, но мне не понятно то что я нашёл в сети. :blush2: Помогите.
     
    Последнее редактирование: 26 ноя 2015
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Саша Шеин, 1. Это одинаково для sql и mysql
    2. Смотри 1.
    3. Сам же ответил на свой вопрос - EmitAmbientSound
    Только не в цикле:
    PHP:
    decl Float:pos_c[3]; 
    GetClientAbsOrigin(clientFloat:pos_c); 
    EmitAmbientSound("acegamer/pain/men/pain04.mp3" pos_cclient); 
     
  3. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    R1KO, а четыре? Теперь пишет:
    И вовремя убийства подлагивает.

    Добавлено через 57 секунд
    А оно вообще правильно написано?
     
    Последнее редактирование: 22 окт 2015
  4. NeXxX

    NeXxX

    Сообщения:
    320
    Симпатии:
    18
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Эй Сашка ты что задумал?
     
  5. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Оффтоп
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    PHP:
    public SQLT_OnClientSave(Handle:hOwnerHandle:hQuery, const String:sError[], any:iUserId)
    {
        new 
    iClient GetClientOfUserId(iUserId);
        if (!
    iClient)
        {
            return;
        }
        
        if (!
    hQuery)
        {
            
    LogError("SQLT_OnInsertClient: %s"sError);
        }
        
    g_bIsLoad[iClient] = false;
    Поменяй местами. А то если игрок станетне валиден но будет ошибка - её в логе не будет.

    PHP:
    public SQLT_OnClientPutInServer(Handle:hOwnerHandle:hQuery, const String:sError[], any:iUserId)
    {
        new 
    iClient GetClientOfUserId(iUserId);
        if (!
    iClient)
        {
            return;
        }
        
        if (!
    hQuery)
        {
            
    LogError("SQLT_OnClientPutInServer: %s"sError);
            
    g_bIsLoad[iClient] = false;
        }
    Тут тоже

    PHP:
     new iClient GetClientOfUserId(iUserId);
        if (!
    iClient)
        {
            return;
        }
        
        if (!
    hQuery)
        {
            
    LogError("SQLT_OnInsertClient: %s"sError);
            
    g_bIsLoad[iClient] = false;
        }
    Ну и тут


    PHP:
     decl String:sQuery[250];
            
    GetClientAuthString(iClientsQuery32);
            
    Format(sQuery650"INSERT INTO `new_mod_table` (`exp`,`kills`,`deaths`,`level`,`credits`,`steamid`) VALUES (0,0,0,1,0,'%s')"sQuery);
    Ничего что размер sQuery 250, а ты указываешь 650.

    Про 4 вк написал ответ.
     
  7. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    PHP:
    L 10/22/2015 18:42:53: [SMPlugin encountered error 30Script execution timed out
    L 10
    /22/2015 18:42:53: [SMDisplaying call stack trace for plugin "mod.smx":
    L 10/22/2015 18:42:53: [SM]   [0]  Line 84mod.sp::EV_Death()
    L 10/22/2015 18:43:37: [SMPlugin encountered error 30Script execution timed out
    L 10
    /22/2015 18:43:37: [SMDisplaying call stack trace for plugin "mod.smx":
    L 10/22/2015 18:43:37: [SM]   [0]  Line 84mod.sp::EV_Death()
    L 10/22/2015 18:43:43Error log file session closed.

    PHP:
    public Action:EV_Death(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event,"userid")),
            
    attacker GetClientOfUserId(GetEventInt(event"attacker"));
            
        if(
    client && attacker /*&& !IsFakeClient(client) && !IsFakeClient(attacker)*/)
        {
            new 
    bHead GetEventBool(event,"headshot");
            
            
    g_iKills[attacker]++;
            
    g_iDeaths[client]++;
            
            
    g_iCredits[attacker]=g_iCredits[attacker]+((bHead)?g_iCreditsHead:g_iCreditsKill);
            
            new 
    newxp=g_iExp[attacker]+((bHead)?g_iExpHead:g_iExpKill);
            if(
    newxp>=(g_iLevel[attacker]*g_iExpInc))
            {
                
                new 
    newlevel=0;
                new 
    reqxp g_iLevel[attacker]*g_iExpInc;
                while(
    g_iExp[attacker]>reqxp)
                {
                    
    newxp-=reqxp;
                    
    newlevel g_iLevel[attacker] + 1// 84
                
    }
                while(
    newxp<0)
                {
                    
    newlevel-=1;
                    
    newxp=reqxp-g_iExpInc-newxp;
                }
                
    g_iLevel[attacker] = newlevel;
                
    g_iExp[attacker] = newxp;
                
    PrintToChat(attacker,"[New Mod] Вы получили:");
                
    PrintToChat(attacker,"Новый уровень %d",g_iLevel[attacker]);
                
    PrintToChat(attacker,"Теперь у вас %d EXP",g_iExp[attacker]);
            }
        }
    }
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Саша Шеин, с циклами напартачил
     
  9. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Это я понял, но не понял где именно..

    Оффтоп
     
  10. rom4s

    rom4s

    Сообщения:
    100
    Симпатии:
    31
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Интересный у вас цикл, вы сравниваете g_iExp[attacker] и reqxp, но при этом с ними ничего не делаете.
     
  11. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Саша Шеин, ты кажется вообще вечный цикл запускаешь.
     
  12. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Re: Вопросы по: MySql/Sql & Логике & EmitSound

    Да цикл непрерывный получился :)
     
  13. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Всем привет!

    Вопрос по координатам:
    1) Как изменить направление прицела у игрока, то есть я создал entity и надо сделать так, чтобы игрок начал смотреть на неё, но если только он её видит, очень прошу объяснить кодом, т.к. с координатами не умею работать!?

    2) Как изменить конечную точку выстрела, но не визуально, а реально?

    3) Надо создать 5+ ентити, в радиусе от точки, но есть шансы что ентити окажется в стенке или за стенкой, как это избежать?
     
  14. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    1. Получаем координаты обоих сущностей, проверяем, видит ли игрок эту сущность.
    Код:
    bool:IsVisible(iClient, iEntity)
    {
        decl Float:vClientEye[3], Float:vEntityOrigin[3];
        GetClientEyePosition(iClient, vClientEye);
        GetEntPropVector(iEntity, Prop_Data, "m_vecOrigin", vEntityOrigin);
        TR_TraceRayFilter(vClientEye, vEntityOrigin, MASK_VISIBLE, RayType_EndPoint, Filter_NoPlayers);
        return (TR_GetFraction() == 1.0);
    }
    
    public bool:Filter_NoPlayers(iEntity, iMask)
    {
        return (iEntity <= 0 || iEntity > MaxClients);
    }
    Для того, чтобы игрок стал смотреть куда нам нужно, нужно изменить его угол. Для этого надо получить координаты сущностей, из двух точек можно образовать вектор, а вот углы вектора как раз будут тем углами, которые нужно установить игроку.
    Код:
    ForceLook(iClient, iEntity)
    {
        decl Float:vClientEye[3], Float:vEntityOrigin[3];
        GetClientEyePosition(iClient, vClientEye);
        GetEntPropVector(iEntity, Prop_Data, "m_vecOrigin", vEntityOrigin);
        
        decl Float:vDirection[3], Float:vDirectionAngle[3];
        MakeVectorFromPoints(vClientEye, vEntityOrigin, vDirection);
        GetVectorAngles(vDirection, vDirectionAngle);
        
        TeleportEntity(iClient, NULL_VECTOR, vDirectionAngle, NULL_VECTOR);
    }
    2. Вряд ли это возможно. Можно лишь изменить разбор оружия либо его отдачу.

    3. Генерируем случайный угол. Делаем из нужной точки TraceRay, получаем координаты препятствия по этому углу. Итого получаем дистанцию от точки до первого препятствия. Зная углы вектора, начальную и конечную точку, можно найти любую точку на этой прямой. Добавляем некие константы, если создаваемый объект не может быть создан в стене или в начальной точке (в примере код не дает создавать объект ближе чем 20.0 юнитов от начальной точки.
    Код:
    public OnPluginStart() 
    {
        RegConsoleCmd("sm_randomspawn", Command_RandomSpawn);
    }
    
    public OnMapStart() 
    {
        g_iLightningSprite = PrecacheModel("sprites/lgtning.vmt");  
        g_iGlowSprite = PrecacheModel("materials/sprites/blueflare1.vmt");
    }
    
    public Action:Command_RandomSpawn(iClient, iArgs)
    {
        decl Float:vOrigin[3], Float:vAngles[3], Float:vEndOrigin[3];
        GetClientEyePosition(iClient, vOrigin);
        GetClientEyeAngles(iClient, vAngles);
        vAngles[0] += GetRandomFloat(-45.0, 45.0);
        vAngles[1] += GetRandomFloat(-45.0, 45.0);
        vAngles[2] += GetRandomFloat(-45.0, 45.0);
        
        GetViewOrigin(iClient, vOrigin, vAngles, vEndOrigin);
        TE_SetupBeamPoints(vOrigin, vEndOrigin, g_iLightningSprite, g_iLightningSprite, 0, 24, 2.0, 3.0, 3.0, 1, 0.0, {255, 0, 0, 255}, 1);
        TE_SendToAll();
        
        decl Float:vDirection[3], Float:vDistance;
        vDistance = GetVectorDistance(vOrigin, vEndOrigin);
        if ( vDistance >= 20.0 ) {
            GetAngleVectors(vAngles, vDirection, NULL_VECTOR, NULL_VECTOR);
            ScaleVector(vDirection, GetRandomFloat(20.0, vDistance));
            AddVectors(vOrigin, vDirection, vOrigin);
            
            TE_SetupGlowSprite(vOrigin, g_iGlowSprite, 2.0, 1.0, 255);
            TE_SendToAll();
        }
        else {
            Command_RandomSpawn(iClient, 0);
        }
        
        return Plugin_Handled;
    }
    
    bool:GetViewOrigin(iClient, Float:vOrigin[3], Float:vAngles[3], Float:vEndOrigin[3])
    {
        TR_TraceRayFilter(vOrigin, vAngles, MASK_SOLID, RayType_Infinite, TR_DontHitSelf, iClient);
        if ( TR_DidHit(INVALID_HANDLE) )
        {
            TR_GetEndPosition(vEndOrigin, INVALID_HANDLE);
        }
    }
    
    public bool TR_DontHitSelf(int iEntity, int iMask, any iData) { return ( iEntity != iData ); }
    Код создается на красной линии светящуюся белую точку. Если нужно, чтобы объект создавался на полу, а не в воздухе, то нужно будет опустить перпендикуляр вниз из найденной случайной точки.

    К посту прикладываю два файла - полные исходники к этим плагинам. Первый по команде sm_forcelook <entity> устанавливает прицел на неё, если эта сущность видна, второй по команде sm_randomspawn создает линию и светящуюся белую точку в случайной позиции на этой линии.
     

    Вложения:

    Саша Шеин и Danyas нравится это.
  15. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Re: Вопросы по: MySql/Sql & Логике & EmitSound & Координаты & Работа с объектами

    Здравствуйте, подскажите как поправить данный код, чтобы объект спавнился и падал вниз?
    PHP:
     CreateEnt(client,Float:pos[3])
    {
     
    //new iEntity = CreateEntityByName("prop_dynamic_override");
      
    new iEntity CreateEntityByName("prop_physics_multiplayer");
     if (
    IsValidEdict(iEntity))
     {
      
    DispatchKeyValue(iEntity"solid""6");
      
    /* ДВИГАЕТСЯ */
       
    DispatchKeyValueiEntity"physicsmode""2");
       
    DispatchKeyValueiEntity "massScale""1.0");
       
    /* *** */
      
    if (mdls[2][0])DispatchKeyValue(iEntity"model"mdls[2]);
      
    DispatchSpawn(iEntity);
       
      
    SetEntProp(iEntityProp_Send"m_usSolidFlags"8);
      
    SetEntProp(iEntityProp_Send"m_CollisionGroup"1);
      
    SetEntityMoveType(iEntityMOVETYPE_NONE);
      
    TeleportEntity(iEntityposNULL_VECTORNULL_VECTOR);
      
    SetEntityRenderMode(iEntityRENDER_TRANSCOLOR); 
      
    SetEntityRenderColor(iEntity,255,0,0,255); 
      
    EmitAmbientSound(sound_hkposiEntity);
      
    decl String:buf[30];
      
    Format(buf30"OnUser1 !self:kill::%1.f:-1"float(data_hk[0]));
      
    SetVariantString(buf);
      
    AcceptEntityInput(iEntity"AddOutput");
      
    AcceptEntityInput(iEntity"FireUser1");
      
    SDKHook(iEntitySDKHook_EndTouchHook_EndTouch);
      
    SDKHook(iEntitySDKHook_StartTouchHook_StartTouch);
      
    SetNeon(iEntity);
      
    CreateTimer(float(data_hk[0]), DeleteParticlesclient);
     }
    }
     
  16. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    SetEntityMoveType(iEntity, MOVETYPE_NONE); убери
     
  17. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Что означает данное выражение?

    PHP:
    new home to 4// to и home это числа (например to равно пяти)
     
  18. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.564
    Симпатии:
    1.150
    Саша Шеин, думаю будет 4 у всех. Лучше проведи тест, выведи эти значения в чат когда назначаешь.
     
  19. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Здравствуйте, подскажите как шагнуть на уровень ниже.

    Есть функция, например, CreateDir, как сдать директорию не рядом с addons, а ниже, рядом с csgo / cstrike папками. И вообще возможно ли это...

    Заранее спасибо!
     
  20. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.564
    Симпатии:
    1.150