[AMX][Codes] Hỏi đáp về các code của AMX ...

Thảo luận trong 'Counter Strike' bắt đầu bởi sontung0, 6/8/09.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. buiquangba

    buiquangba Mr & Ms Pac-Man

    Tham gia ngày:
    11/12/08
    Bài viết:
    248
    anh Chief hiểu nhầm ý em rồi, ý em là cái command đó có Code như thế nào
    về Fastrun nha ^^
     
  2. dias

    dias Mega Man

    Tham gia ngày:
    17/1/10
    Bài viết:
    3,226
    Nơi ở:
    SEOUL
    Bộ ông tưởng Tôi Dựa vào sv Thebest àh :)).
    => Có vài cái hay thì làm giống chứ dựa thì ăn cám là vừa :|
     
  3. My Own Way

    My Own Way S.V.E.N Commander Lão Làng GVN

    Tham gia ngày:
    30/7/09
    Bài viết:
    12,230
    Nơi ở:
    Hải Phòng
    Ta không nói chú dựa vào The Best.. Sao tự nhiên kêu lên The Best ở đây :)) ta chỉ comment lại cái mà chú nói ở trên kia kìa.
     
  4. Ken777

    Ken777 Dragon Quest

    Tham gia ngày:
    19/11/08
    Bài viết:
    1,254
    Cái Plugin Effeck killer hiện 1 spr có file sma ko,của sontung để time kill tận 8 thì cao wá,mún chỉnh lại 4 thôi
     
  5. kakaan96

    kakaan96 Dragon Quest

    Tham gia ngày:
    29/1/10
    Bài viết:
    1,422
    bắt đầu nội chiến rồi đây
    @Chife :ok
     
  6. nhockstyle

    nhockstyle Mr & Ms Pac-Man

    Tham gia ngày:
    10/5/10
    Bài viết:
    164
    Mấy bác cho hỏi có cách nào để lưu code của amx ko
     
  7. My Own Way

    My Own Way S.V.E.N Commander Lão Làng GVN

    Tham gia ngày:
    30/7/09
    Bài viết:
    12,230
    Nơi ở:
    Hải Phòng
    Anh không hiểu em đang nói gì...file source của amxx định dạng sma, các code lưu trong đó.
     
  8. rocxman800

    rocxman800 Dragon Quest

    Tham gia ngày:
    7/11/05
    Bài viết:
    1,215
    Nơi ở:
    trên Trển áh
    @Ken: Ông có thể tùy chỉnh cvar các plug-in của anh Tùng trong file nst.ini đc mà :| nst_ek có 2 cvar tui hay chỉnh là nst_time_show (thời gian hiển thị) và nst_time_kill (thời gian xuất hiện giữa các sprite - Cái ông cần đấy :D)
     
  9. My Own Way

    My Own Way S.V.E.N Commander Lão Làng GVN

    Tham gia ngày:
    30/7/09
    Bài viết:
    12,230
    Nơi ở:
    Hải Phòng
    Trong cái ấy không có cvar chỉnh thời gian khoảng cách giữa 2 combo..
     
  10. Ken777

    Ken777 Dragon Quest

    Tham gia ngày:
    19/11/08
    Bài viết:
    1,254
    Plugin effect killer đầu của anh tùng chỉ hiện 1 spr thôi,có 3 cvar là type sex time,mặc định anh tùng để time là 8 rồi,tui mún chỉnh lại 4 nên mới cần sma,ko lẽ mỗi lần vào chơi cứ phải gõ @-@
     
  11. rocxman800

    rocxman800 Dragon Quest

    Tham gia ngày:
    7/11/05
    Bài viết:
    1,215
    Nơi ở:
    trên Trển áh
    Thế mới bảo gõ dòng cvar đó vào nst.ini để nó mặc định hóa
    @Chief: Đúng là cài mặc định thì ko có thật, nhưng tự add vào nó vẫn có tác dụng chứ nhỉ :D
     
  12. Ken777

    Ken777 Dragon Quest

    Tham gia ngày:
    19/11/08
    Bài viết:
    1,254
    èo,phải tạo 1 file nst.ini à
     
  13. My Own Way

    My Own Way S.V.E.N Commander Lão Làng GVN

    Tham gia ngày:
    30/7/09
    Bài viết:
    12,230
    Nơi ở:
    Hải Phòng
    Cái thời gian xem trong đống code có đấy, không nhớ ở line nào...
     
  14. Ken777

    Ken777 Dragon Quest

    Tham gia ngày:
    19/11/08
    Bài viết:
    1,254
    ko dc ợ,ver mới của NST thì có 4 cvar,ver cũ thì 3,cái ver cũ chỉ hiện 1 spr 1 lần thui,cái tui cần là ver cũ ý mà lại ko có sma
     
  15. My Own Way

    My Own Way S.V.E.N Commander Lão Làng GVN

    Tham gia ngày:
    30/7/09
    Bài viết:
    12,230
    Nơi ở:
    Hải Phòng
    Ver cũ xem mấy trang đầu của bác Tùng.
     
  16. sontung0

    sontung0 Dragon Quest

    Tham gia ngày:
    27/5/09
    Bài viết:
    1,333
    cho cậu sma của Effects Killer V3.0 luôn này: (chỉ dùng đc trong CSO NST thôi nhé.vì nó dùng vài native của NST Wpn và Player)
    Muốn chỉ tính đến 4 kill thì chỉnh cái #define LEVELS 8
    Còn muốn dùng độc lập plugin thì thay thế vài cái native bằng các cvar là đc
    Tự vọc nhớ
    PHP:
    #include <amxmodx>
    #include <fakemeta>

    #include <nst_player>
    #include <nst_zombie>
    #include <nst_wpn>


    #define PLUGIN "Effects Killer"
    #define VERSION "3.0"
    #define AUTHOR "NST"

    #define LEVELS 8
    new kills[33], Float:timekill[33], revenge[33], oneshot[33]
    new 
    iconstatusg_firstkillg_lastkill
    new g_FM_Running
    new cvar_time_killcvar_typecvar_time_show

    new const sound_combo[][] =
    {
        
    "vox/kill/%s/kill_1_%s.wav"
        
    "vox/kill/%s/kill_2_%s.wav"
        
    "vox/kill/%s/kill_3_%s.wav"
        
    "vox/kill/%s/kill_4_%s.wav"
        
    "vox/kill/%s/kill_5_%s.wav"
        
    "vox/kill/%s/kill_6_%s.wav"
        
    "vox/kill/%s/kill_7_%s.wav"
        
    "vox/kill/%s/kill_8_%s.wav"
        
    "vox/kill/%s/revenge_%s.wav"
        
    "vox/kill/%s/headshot_%s.wav"
        
    "vox/kill/%s/knife_%s.wav"
        
    "vox/kill/%s/grenade_%s.wav"
    }
    enum(+= 100)
    {
        
    TASK_HIDESPR 2000
    }
    #define ID_HIDESPR (taskid - TASK_HIDESPR)
    enum
    {
        
    HUD_SOUND 1,
        
    HUD_MSGTEXT,
        
    HUD_SPRNAME
    }
    enum
    {
        
    KILL_1 1,
        
    KILL_2,
        
    KILL_3,
        
    KILL_4,
        
    KILL_5,
        
    KILL_6,
        
    KILL_7,
        
    KILL_8,
        
    KILL_FIRST,
        
    C4_DEFUSE,
        
    C4_SET
    }
    enum
    {
        
    KILL_NONE 51,
        
    KILL_HEGRENADE,
        
    KILL_HEADSHOT,
        
    KILL_KNIFE,
        
    KILL_LAST,
        
    KILL_REVENGE,
        
    WALLSHOT,
        
    WALLSHOT_HEADSHOT,
        
    ONESHOT_2KILL,
        
    ONESHOT_3KILL
    }


    public 
    plugin_precache()
    {
        for (new 
    1<= 2i++)
        {
            new 
    sex[32]
            if (
    == 1sex "woman"
            
    else sex "man"
            
            
    for (new 0<= 11e++)
            {
                new 
    sound_ct[100], sound_t[100], team_ct[32] = "ct"team_t[32] = "t"
                
    format(sound_ct99sound_combo[e], sexteam_ct)
                
    format(sound_t99sound_combo[e], sexteam_t)
                
    //precache_sound(sound_ct)
                //precache_sound(sound_t)
            
    }
            
        }
        
    //precache_sound("misc/MultiKill/C4_Defuse.wav")
        //precache_sound("misc/MultiKill/C4_Set.wav")
        
    }
    public 
    plugin_init()
    {
        
    register_plugin(PLUGINVERSIONAUTHOR)
        
        
    register_event("HLTV""event_round_start""a""1=0""2=0")
        
    register_event("DeathMsg""event_DeathMsg""a")
        
        
    cvar_time_kill register_cvar("nst_ek_time_kill","3")
        
    cvar_type register_cvar("nst_ek_type","1")
        
    cvar_time_show register_cvar("nst_ek_time_show","2.0")
        
        
    iconstatus get_user_msgid("StatusIcon")
        
    g_FM_Running is_module_loaded("FakeMeta")
    }
    public 
    event_round_start()
    {
        new 
    reset_value[33]

        
    g_firstkill 1
        kills 
    reset_value
        revenge 
    reset_value
        oneshot 
    reset_value
    }
    public 
    event_DeathMsg()
    {
        
    // get value data
        
    static killerheadshotweapon[32], wpnindexvictim
        killer 
    read_data(1)
        
    victim read_data(2)
        
    headshot read_data(3)
        
    read_data(4weaponcharsmax(weapon))
        if (
    equali(weapon"grenade")) format(weaponcharsmax(weapon), "hegrenade")
        
    format(weaponcharsmax(weapon), "weapon_%s"weapon)
        
    wpnindex get_weaponid(weapon)
        
        
    // none killer = victim
        
    if (!is_user_connected(killer) || !is_user_connected(victim) || killer==victim) return;
        if (
    get_user_team(killer)==get_user_team(victim) && !get_cvar_num("mp_friendlyfire")) return;
        
        
    // reset kills of victim
        
    kills[victim] = 0

        
    // set revenge of victim
        
    revenge[victim] = killer

        
    // get num kill & one shoot multikill
        
    new Float:timeleft get_gametime()-timekill[killer]
        if (
    timeleft <= get_pcvar_float(cvar_time_kill)) kills[killer] += 1
        
    else kills[killer] = 1
        
    if (kills[killer]>LEVELSkills[killer] = 1
        timekill
    [killer] = get_gametime()

        if (!
    oneshot[killer]) oneshot[killer] = 1
        
    if (!timeleft && wpnindex != CSW_HEGRENADEoneshot[killer] += 1
        
    else oneshot[killer] = 1
        oneshot
    [killer] = min(3oneshot[killer])
        
    //client_print(killer, print_chat, "%i", oneshot[killer])
        
        // get last kill
        
    new players_ct[32], players_t[32], ictite
        get_players
    (players_ct,ict,"ae","CT")   
        
    get_players(players_t,ite,"ae","TERRORIST")
        if (
    ict == || ite == 0g_lastkill 1
        
        
    // check revenge
        
    new g_revenge
        
    if (victim == revenge[killer])
        {
            
    g_revenge 1
            revenge
    [killer] = 0
        
    }

        
    // hud 1
        
    new check_sound
        
    if (oneshot[killer] > 1)
        {
            if (
    oneshot[killer] == 2show_hud(killerONESHOT_2KILL)
            else if (
    oneshot[killer] == 3show_hud(killerONESHOT_3KILL)
        }
        else if (
    g_lastkill)
        {
            
    g_lastkill 0
            show_hud
    (killerKILL_LAST)
        }    
        else if (
    g_revenge)
        {
            
    play_sound(killerKILL_REVENGE)
            
    show_hud(killerKILL_REVENGE)
        }
        else if ((
    wpnindex != CSW_KNIFE) && (wpnindex != CSW_HEGRENADE) && !can_see_fm(killervictim)) 
        {
            if (
    headshot)
            {
                if (
    kills[killer] == 1)
                {
                    
    play_sound(killerKILL_HEADSHOT)
                    
    check_sound 1
                
    }
                
    show_hud(killerWALLSHOT_HEADSHOT)
            }
            else 
    show_hud(killerWALLSHOT)
        }
        else if (
    headshot && wpnindex)
        {
            if (
    kills[killer] == 1)
            {
                
    play_sound(killerKILL_HEADSHOT)
                
    check_sound 1
            
    }
            
    show_hud(killerKILL_HEADSHOT)
        }
        else if (
    wpnindex == CSW_KNIFE)
        {
            if (
    kills[killer] == 1)
            {
                
    play_sound(killerKILL_KNIFE)
                
    check_sound 1
            
    }
            
    show_hud(killerKILL_KNIFE)
        }
        else if (
    wpnindex == CSW_HEGRENADE)
        {
            if (
    kills[killer] == 1)
            {
                
    play_sound(killerKILL_HEGRENADE)
                
    check_sound 1
            
    }
            
    show_hud(killerKILL_HEGRENADE)
        }
        else
        {
            
    show_hud(killerKILL_NONE)
        }
        
        
        
    // hud 2
        
    if (g_firstkill)
        {
            
    g_firstkill 0
            show_hud
    (killerKILL_FIRST)
            if (!
    check_soundplay_sound(killerKILL_1)
        }
        else
        {
            
    show_hud(killerkills[killer])
            if (!
    check_soundplay_sound(killerkills[killer])
        }

    }
    public 
    bomb_defused(id)
    {
        
    show_hud(idC4_DEFUSE)
        
    play_sound(idC4_DEFUSE)
    }
    public 
    bomb_planted(id)
    {
        
    show_hud(idC4_SET)
        
    play_sound(idC4_SET)
    }


    // #################### SHOW HUD ####################
    show_hud(ididhud)
    {
        if (!
    is_user_connected(id)) return;
        
        new 
    type_cvar get_pcvar_num(cvar_type)
        if (
    type_cvar == 1show_spr(ididhud)
        else if (
    type_cvar == 2show_msg(ididhud)
    }
    play_sound(ididhud)
    {
        if (!
    is_user_connected(id)) return;
        
        new 
    sound[64], team[32], sex[32], cs_team
        
    if (nst_get_mod_runing()==NST_MOD_ZB3cs_team nst_get_user_team(id)
        else 
    cs_team get_user_team(id)
            
        if (
    cs_team==1team "T"
        
    else team "CT"
        
    if (get_user_sex(id) == 2sex "woman"
        
    else sex "man"
        
    format(soundcharsmax(sound), "%s"get_hud_data(idhudHUD_SOUND))
        
    format(soundcharsmax(sound), soundsexteam)
        
        
    PlaySound(idsound)
    }

    show_msg(ididhud)
    {
        new 
    msg[64]
        
    format(msgcharsmax(msg), "%s"get_hud_data(idhudHUD_MSGTEXT))

        
    set_hudmessage(02040, -1.00.6510.023.00.30.32)
        
    show_hudmessage(idmsg)
    }
    show_spr(ididspr)
    {
        if (
    idspr >= KILL_NONEhide_spr(id2)
        else 
    hide_spr(id1)

        
    spr_action(ididspr1)
        
        if (
    idspr KILL_NONE)
        {
            if (
    task_exists(id+TASK_HIDESPR)) remove_task(id+TASK_HIDESPR)
            
    set_task(get_pcvar_float(cvar_time_show), "task_hidehud"id+TASK_HIDESPR)
        }

    public 
    task_hidehud(taskid)
    {
        new 
    id ID_HIDESPR
        hide_spr
    (id2)
        
    hide_spr(id1)

    }
    hide_spr(ididspr)
    {
        if (
    idspr == 1)
        {
            for (new 
    KILL_1<= C4_SETi++)
            {
                
    spr_action(idi0)
            }
        }
        else if (
    idspr == 2)
        {
            for (new 
    KILL_NONE<= ONESHOT_3KILLi++)
            {
                
    spr_action(idi0)
            }
        }
    }  
    spr_action(idsprrun)
    {    
        new 
    sprname[64]
        
    format(sprnamecharsmax(sprname), "%s"get_hud_data(sprHUD_SPRNAME))

        
    message_begin(MSG_ONE,iconstatus,{0,0,0},id)
        
    write_byte(run// status (0=hide, 1=show, 2=flash)
        
    write_string(sprname// sprite name
        
    message_end()
    }
    get_hud_data(idhudtype)
    {
        new 
    value[64], sprname[33], sound[64], msgtext[32]
        
        switch (
    idhud)
        {
            case 
    KILL_1:
            {
                
    sprname "kill_1"
                
    sound "vox/kill/%s/kill_1_%s"
                
    msgtext "1 KILL"
            
    }
            case 
    KILL_2:
            {
                
    sprname "kill_2"
                
    sound "vox/kill/%s/kill_2_%s"
                
    msgtext "2 KILL"
            
    }
            case 
    KILL_3:
            {
                
    sprname "kill_3"
                
    sound "vox/kill/%s/kill_3_%s"
                
    msgtext "3 KILL"
            
    }
            case 
    KILL_4:
            {
                
    sprname "kill_4"
                
    sound "vox/kill/%s/kill_4_%s"
                
    msgtext "4 KILL"
            
    }
            case 
    KILL_5:
            {
                
    sprname "kill_5"
                
    sound "vox/kill/%s/kill_5_%s"
                
    msgtext "5 KILL"
            
    }
            case 
    KILL_6:
            {
                
    sprname "kill_6"
                
    sound "vox/kill/%s/kill_6_%s"
                
    msgtext "6 KILL"
            
    }
            case 
    KILL_7:
            {
                
    sprname "kill_7"
                
    sound "vox/kill/%s/kill_7_%s"
                
    msgtext "7 KILL"
            
    }
            case 
    KILL_8:
            {
                
    sprname "kill_8"
                
    sound "vox/kill/%s/kill_8_%s"
                
    msgtext "8 KILL"
            
    }
            case 
    KILL_FIRST:
            {
                
    sprname "kill_first"
                
    msgtext "FIRST KILL"
            
    }
            case 
    C4_DEFUSE:
            {
                
    sprname "c4_defuse"
                
    sound "vox/kill/c4_defuse"
            
    }
            case 
    C4_SET:
            {
                
    sprname "c4_set"
                
    sound "vox/kill/c4_set"
            
    }
        
        
            case 
    KILL_NONE:
            {
                
    sprname "kill_none"
            
    }
            case 
    KILL_HEGRENADE:
            {
                
    sprname "kill_he"
                
    sound "vox/kill/%s/grenade_%s"
                
    msgtext "GRENADE KILL"
            
    }
            case 
    KILL_HEADSHOT:
            {
                
    sprname "kill_headshot"
                
    sound "vox/kill/%s/headshot_%s"
                
    msgtext "HEADSHOT"
            
    }
            case 
    KILL_KNIFE:
            {
                
    sprname "kill_knife"
                
    sound "vox/kill/%s/knife_%s"
                
    msgtext "KNIFE KILL"
            
    }
            case 
    KILL_LAST:
            {
                
    sprname "kill_last"
            
    }
            case 
    KILL_REVENGE:
            {
                
    sprname "kill_revenge"
                
    sound "vox/kill/%s/revenge_%s"
                
    msgtext "REVENGE"
            
    }
            case 
    WALLSHOT:
            {
                
    sprname "wall_shot"
                
    msgtext "WALLSHOOT"
            
    }
            case 
    WALLSHOT_HEADSHOT:
            {
                
    sprname "wall_shot_hs"
                
    msgtext "WALLSHOOT HEADSHOT"
            
    }
            case 
    ONESHOT_2KILL:
            {
                
    sprname "1shot_2kill"
                
    msgtext "ONE SHOT 2 KILL"
            
    }
            case 
    ONESHOT_3KILL:
            {
                
    sprname "1shot_3kill"
                
    msgtext "ONE SHOT MULTIKILL"
            
    }
        }

        if (
    type==HUD_SOUNDformat(valuecharsmax(value), "%s"sound)
        else if (
    type==HUD_MSGTEXTformat(valuecharsmax(value), "%s"msgtext)
        else if (
    type==HUD_SPRNAMEformat(valuecharsmax(value), "%s"sprname)
        
        return 
    value;
    }
    get_user_sex(id)
    {
        new 
    mod_runingsex
        mod_runing 
    nst_get_mod_runing()
        if ( (
    mod_runing == NST_MOD_ZB3 || mod_runing == NST_MOD_ZBU || mod_runing == NST_MOD_ZBS) && nst_zb_get_user_zombie(id) )
        {
            
    sex nst_zb_get_user_sex(id)
        }
        else
        {
            
    sex nst_get_user_sex(id)
        }

        return 
    sex;
    }
    // Plays a sound on clients
    PlaySound(id, const sound[])
    {
        if (
    equal(sound[strlen(sound)-4], ".mp3"))
            
    client_cmd(id"mp3 play ^"sound/%s^""sound)
        else
            
    client_cmd(id"spk ^"%s^""sound)
    }
    bool:can_see_fm(entindex1entindex2)
    {
        if ((!
    g_FM_Running) || !entindex1 || !entindex2)
            return 
    false
    //  new ent1, ent2

        
    if (pev_valid(entindex1) && pev_valid(entindex1))
        {
            new 
    flags pev(entindex1pev_flags)
            if (
    flags EF_NODRAW || flags FL_NOTARGET)
            {
                return 
    false
            
    }

            new 
    Float:lookerOrig[3]
            new 
    Float:targetBaseOrig[3]
            new 
    Float:targetOrig[3]
            new 
    Float:temp[3]

            
    pev(entindex1pev_originlookerOrig)
            
    pev(entindex1pev_view_ofstemp)
            
    lookerOrig[0] += temp[0]
            
    lookerOrig[1] += temp[1]
            
    lookerOrig[2] += temp[2]

            
    pev(entindex2pev_origintargetBaseOrig)
            
    pev(entindex2pev_view_ofstemp)
            
    targetOrig[0] = targetBaseOrig [0] + temp[0]
            
    targetOrig[1] = targetBaseOrig [1] + temp[1]
            
    targetOrig[2] = targetBaseOrig [2] + temp[2]

            
    engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the had of seen player
            
    if (get_tr2(0TraceResult:TR_InOpen) && get_tr2(0TraceResult:TR_InWater))
            {
                return 
    false
            

            else 
            {
                new 
    Float:flFraction
                get_tr2
    (0TraceResult:TR_flFractionflFraction)
                if (
    flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                {
                    return 
    true
                
    }
                else
                {
                    
    targetOrig[0] = targetBaseOrig [0]
                    
    targetOrig[1] = targetBaseOrig [1]
                    
    targetOrig[2] = targetBaseOrig [2]
                    
    engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the body of seen player
                    
    get_tr2(0TraceResult:TR_flFractionflFraction)
                    if (
    flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                    {
                        return 
    true
                    
    }
                    else
                    {
                        
    targetOrig[0] = targetBaseOrig [0]
                        
    targetOrig[1] = targetBaseOrig [1]
                        
    targetOrig[2] = targetBaseOrig [2] - 17.0
                        engfunc
    (EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the legs of seen player
                        
    get_tr2(0TraceResult:TR_flFractionflFraction)
                        if (
    flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                        {
                            return 
    true
                        
    }
                    }
                }
            }
        }
        return 
    false
    }
    Lại quên mang plugin cho ông Chief rồi hic
     
  17. Ken777

    Ken777 Dragon Quest

    Tham gia ngày:
    19/11/08
    Bài viết:
    1,254
    Èo,e cám ơn a tùng nhưng có cách nào dùng cho các ver khác ko,e chơi tới 4 bản CS lận
     
  18. kakaan96

    kakaan96 Dragon Quest

    Tham gia ngày:
    29/1/10
    Bài viết:
    1,422
    ông Chief chỉ tôi vụ sprites đi :D
     
  19. My Own Way

    My Own Way S.V.E.N Commander Lão Làng GVN

    Tham gia ngày:
    30/7/09
    Bài viết:
    12,230
    Nơi ở:
    Hải Phòng
    @kaan94: Trên AM có TUT
    Nếu muốn dùng trong Cs thường thì copy cái inc mà anh Tùng dùng make plugin là đc có đúng ko ?
     
  20. rocxman800

    rocxman800 Dragon Quest

    Tham gia ngày:
    7/11/05
    Bài viết:
    1,215
    Nơi ở:
    trên Trển áh
    Anh Tùng cho em hỏi cái v3.0 này có gì mới ko :x
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này