搜索
查看: 3483|回复: 6

终结者p90滚筒枪插件

[复制链接]
发表于 2011-8-18 11:22:24 | 显示全部楼层 |阅读模式 来自 中国–江苏–盐城–建湖县
本帖最后由 381828358 于 2011-8-18 14:12 编辑

我想搞这个插件 终结者p90但是不知道哪里出错了。不是编辑不了,就是带不了服。高手帮我看看

下面这个是我搞的源码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
 楼主| 发表于 2011-8-18 11:25:45 | 显示全部楼层 来自 中国–江苏–盐城–建湖县
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4. #include <cstrike>
  5. #include <xs>

  6. #define SUPPORT_CZBOT

  7. #if defined SUPPORT_CZBOT
  8. new cvar_botquota
  9. new bool:BotHasDebug = false
  10. #endif

  11. #define TASK_RESET_WEAPON        12345

  12. const OFFSET_FlNextPrimaryAttack = 46

  13. const OFFSET_LINUX_WEAPONS = 4

  14. const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_m249)
  15. new const p_p90_V_Model[] = { "models/v_p90.mdl" }
  16. new const p_p90_P_Model[] = { "models/p_p90.mdl" }
  17. new const p_p90_W_Model[] = { "models/w_p90.mdl" }

  18. new cvar_dmg_multiplier, cvar_knock_power, cvar_fire_rate, cvar_bullet_tracer
  19. new g_beamSpr

  20. new g_maxplayers
  21. new bool:hasp_p90[33] = { false, ... }
  22. new user_clip[33] = { 0, ... }, user_bpammo[33] = { 0, ... }
  23. new user_drop[33] = { -1, ... }, Float:drop_time[33] = { 0.0, ... }
  24. new bool:user_shoot[33] = { false, ... }

  25. public plugin_init()
  26. {
  27.         register_clcmd("say /buy_p_p90","p_p90")
  28.         register_cvar("p_p90cost","5000")
  29.         register_plugin("Make your own weapon", "4.0", "FOT")
  30.        
  31.         cvar_dmg_multiplier = register_cvar("cs_lahumshi_dmgmultiplier", "60")
  32.         cvar_knock_power = register_cvar("cs_lahumshi_knockpower", "40")
  33.         cvar_fire_rate = register_cvar("cs_lahumshi_firerate", "0.05")
  34.        
  35.         RegisterHam(Ham_TakeDamage, "player", "fw_Player_TakeDamage")
  36.         RegisterHam(Ham_TraceAttack, "player", "fw_Player_TraceAttack")
  37.         RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "fw_m249_PriAttack")
  38.         RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "fw_m249_PriAttack_Post", 1)
  39.        
  40.         register_forward(FM_SetModel, "fw_SetModel")
  41.         register_forward(FM_Touch, "fw_Touch")
  42.        
  43.         register_event("CurWeapon", "event_cur_weapon", "be", "1=1")
  44.         register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
  45.        
  46.         g_maxplayers = get_maxplayers()
  47.        
  48.         #if defined SUPPORT_CZBOT
  49.         cvar_botquota = get_cvar_pointer("bot_quota")
  50.         #endif
  51.        
  52.         new Float:maptime = get_cvar_float("mp_timelimit")
  53.         if (maptime == 0.0)
  54.                 maptime = 15.0
  55.         new Float:anntime = 60.0 * 5.0 // 5 minutes
  56.         if (maptime < 5.0)
  57.                 anntime = maptime / 3.0
  58.         set_task(anntime, "Announcement", 0, "", 0, "b")
  59. }

  60. public plugin_precache()
  61. {
  62.         precache_model(p_p90_V_Model)
  63.         precache_model(p_p90_P_Model)
  64.         precache_model(p_p90_W_Model)
  65.        
  66.         g_beamSpr = precache_model("sprites/zbeam4.spr")
  67. }

  68. public Announcement(id) {
  69.         client_print(id, print_chat, "所有玩家可買p_p90 [say /buy_p_p90]")
  70. }

  71. public p_p90(id)
  72. {
  73.         new p_p90cost = get_cvar_num("p_p90cost")
  74.         new money = cs_get_user_money(id)
  75.        
  76.         if(!is_user_alive(id))
  77.         {
  78.                 client_print(id,print_chat,"活著才能買p_p90^n")
  79.                 return
  80.         }
  81.        
  82.         if(hasp_p90[id])
  83.         {
  84.                 client_print(id,print_chat,"你已經有p_p90了^n")
  85.                 cs_set_user_bpammo(id, CSW_M249, 90)
  86.                 return
  87.         }
  88.        
  89.         if(money < p_p90cost)
  90.         {
  91.                 client_print(id,print_chat,"現金不足^n")
  92.                 return
  93.         }
  94.        
  95.         cs_set_user_money(id,money-p_p90cost)
  96.         client_print(id,print_chat,"你買了p_p90^n")
  97.         user_drop_m249(id)
  98.         hasp_p90[id] = true
  99.         fm_give_item(id, "weapon_m249")
  100.         cs_set_user_bpammo(id, CSW_M249, 200)
  101.         engclient_cmd(id, "weapon_m249")
  102. }

  103. user_drop_m249(id)
  104. {
  105.         if (user_has_weapon(id, CSW_M249))
  106.         {
  107.                 engclient_cmd(id, "drop", "weapon_m249")
  108.         }
  109. }

  110. public fw_Player_TakeDamage(victim, attacker, Float:damage, damage_type)
  111. {
  112.         static Float:damage_multiplier
  113.         damage_multiplier = get_pcvar_float(cvar_dmg_multiplier)
  114.         if (damage_multiplier <= 0.0)
  115.                 return HAM_IGNORED;
  116.        
  117.         if (victim == attacker || !is_user_connected(attacker))
  118.                 return HAM_IGNORED;
  119.        
  120.         if (!(damage_type & DMG_BULLET))
  121.                 return HAM_IGNORED;
  122.        
  123.         if (!hasp_p90[attacker] || (get_user_weapon(attacker) != CSW_M249))
  124.                 return HAM_IGNORED;
  125.        
  126.         SetHamParamFloat(4, damage * damage_multiplier)
  127.        
  128.         return HAM_IGNORED;
  129. }

  130. public fw_Player_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
  131. {
  132.         static Float:knockpower
  133.         knockpower = get_pcvar_float(cvar_knock_power)
  134.         if (knockpower <= 0.0)
  135.                 return HAM_IGNORED;
  136.        
  137.         if (victim == attacker || !is_user_connected(attacker))
  138.                 return HAM_IGNORED;
  139.        
  140.         if (!(damage_type & DMG_BULLET) || !get_cvar_num("cs_knockback"))
  141.                 return HAM_IGNORED;
  142.        
  143.         if (!hasp_p90[attacker] || (get_user_weapon(attacker) != CSW_M249))
  144.                 return HAM_IGNORED;
  145.        
  146.         static victimflags, Float:knockduck
  147.         victimflags = pev(victim, pev_flags)
  148.         knockduck = get_cvar_float("cs_knockback_ducking")
  149.        
  150.         if (knockduck == 0.0 && (victimflags & FL_DUCKING) && (victimflags & FL_ONGROUND))
  151.                 return HAM_IGNORED;
  152.        
  153.         static Float:origin1F[3], Float:origin2F[3]
  154.         pev(victim, pev_origin, origin1F)
  155.         pev(attacker, pev_origin, origin2F)
  156.        
  157.         if (get_distance_f(origin1F, origin2F) > get_cvar_float("cs_knockback_distance"))
  158.                 return HAM_IGNORED;
  159.        
  160.         static Float:velocity[3]
  161.         pev(victim, pev_velocity, velocity)
  162.        
  163.         if (get_cvar_num("cs_knockback_damage"))
  164.                 xs_vec_mul_scalar(direction, damage, direction)
  165.        
  166.         if (knockpower > 0.0 && get_cvar_num("cs_knockback_power"))
  167.                 xs_vec_mul_scalar(direction, knockpower, direction)
  168.        
  169.         if ((victimflags & FL_DUCKING) && (victimflags & FL_ONGROUND))
  170.                 xs_vec_mul_scalar(direction, knockduck, direction)
  171.        
  172.         xs_vec_add(velocity, direction, direction)
  173.        
  174.         if (!get_cvar_num("cs_knockback_zvel"))
  175.                 direction[2] = velocity[2]
  176.        
  177.         set_pev(victim, pev_velocity, direction)
  178.        
  179.         SetHamParamVector(4, Float:{0.0, 0.0, 0.0})
  180.        
  181.         return HAM_IGNORED;
  182. }

  183. public fw_m249_PriAttack(weapon)
  184. {
  185.         if (!pev_valid(weapon))
  186.                 return HAM_IGNORED;
  187.        
  188.         static owner
  189.         owner = pev(weapon, pev_owner)
  190.        
  191.         if (hasp_p90[owner])
  192.         {
  193.                 if (cs_get_weapon_ammo(weapon) > 0)
  194.                 {
  195.                         user_shoot[owner] = true
  196.                 }
  197.         }
  198.        
  199.         return HAM_IGNORED;
  200. }

  201. public fw_m249_PriAttack_Post(weapon)
  202. {
  203.         if (!pev_valid(weapon))
  204.                 return HAM_IGNORED;
  205.        
  206.         static owner
  207.         owner = pev(weapon, pev_owner)
  208.        
  209.         if (hasp_p90[owner])
  210.         {
  211.                 if (user_shoot[owner])
  212.                 {
  213.                         static Float:fire_rate
  214.                         fire_rate = get_pcvar_float(cvar_fire_rate)
  215.                         if (fire_rate > 0.0)
  216.                         {
  217.                                 static Float:next_pri_attack_time
  218.                                 next_pri_attack_time = get_weapon_next_pri_attack(weapon) * fire_rate
  219.                                 set_weapon_next_pri_attack(weapon, next_pri_attack_time)
  220.                         }
  221.                        
  222.                         if (get_pcvar_num(cvar_bullet_tracer))
  223.                         {
  224.                                 static Float:origin1[3], Float:origin2[3] //, iOrigin[3]
  225.                                 fm_get_aim_vector(owner, 40, origin1, origin2)
  226.                                 origin1[2] += (pev(owner, pev_flags) & FL_DUCKING) ? 3.0 : -7.0
  227.                                 show_tracer_effect(origin1, origin2)
  228.                         }
  229.                        
  230.                         user_shoot[owner] = false
  231.                 }
  232.         }
  233.        
  234.         return HAM_IGNORED;
  235. }

  236. show_tracer_effect(const Float:start_point[3], const Float:end_point[3])
  237. {
  238.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  239.         write_byte(TE_BEAMPOINTS) // TE id: 0
  240.         engfunc(EngFunc_WriteCoord, start_point[0]) // x
  241.         engfunc(EngFunc_WriteCoord, start_point[1]) // y
  242.         engfunc(EngFunc_WriteCoord, start_point[2]) // z
  243.         engfunc(EngFunc_WriteCoord, end_point[0]) // x
  244.         engfunc(EngFunc_WriteCoord, end_point[1]) // y
  245.         engfunc(EngFunc_WriteCoord, end_point[2]) // z
  246.         write_short(g_beamSpr) // sprite index
  247.         write_byte(0) // starting frame
  248.         write_byte(1) // frame rate in 0.1's
  249.         write_byte(1) // life in 0.1's
  250.         write_byte(30) // line width in 0.1's
  251.         write_byte(0) // noise amplitude in 0.01's
  252.         write_byte(0) // red (R.G.B)
  253.         write_byte(245) // green (R.G.B)
  254.         write_byte(255) // blue (R.G.B)
  255.         write_byte(255) // brightness
  256.         write_byte(0) // scroll speed in 0.1's
  257.         message_end()
  258. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2011-8-18 11:26:35 | 显示全部楼层 来自 中国–江苏–盐城–建湖县
  1. public fw_SetModel(entity, const model[])
  2. {
  3.         if (!pev_valid(entity))
  4.                 return FMRES_IGNORED;
  5.        
  6.         new owner
  7.         owner = pev(entity, pev_owner)
  8.        
  9.         if (equal(model[7], "w_weaponbox.mdl"))
  10.         {
  11.                 user_drop[owner] = entity;
  12.                 return FMRES_IGNORED;
  13.         }
  14.        
  15.         if (user_drop[owner] == entity)
  16.         {
  17.                 if (hasp_p90[owner] && equal(model[7], "w_m249.mdl"))
  18.                 {
  19.                         fm_kill_entity(entity)
  20.                        
  21.                         drop_p_p90(owner, 0, 1)
  22.                        
  23.                         drop_time[owner] = get_gametime()
  24.                         hasp_p90[owner] = false
  25.                 }
  26.         }
  27.        
  28.         user_drop[owner] = -1
  29.        
  30.         return FMRES_IGNORED;
  31. }

  32. public fw_Touch(ptr, ptd)
  33. {
  34.         if (!pev_valid(ptr) || !pev_valid(ptd))
  35.                 return FMRES_IGNORED;
  36.        
  37.         new classname[32]
  38.         pev(ptr, pev_classname, classname, charsmax(classname))
  39.        
  40.         if (!equal(classname, "CS_p_p90"))
  41.                 return FMRES_IGNORED;
  42.        
  43.         if (has_custom_weapons(ptd, PRIMARY_WEAPONS_BIT_SUM))
  44.                 return FMRES_IGNORED;
  45.        
  46.         if (get_gametime() - drop_time[ptd] < 0.5)
  47.                 return FMRES_IGNORED;
  48.        
  49.         hasp_p90[ptd] = true
  50.         fm_give_item(ptd, "weapon_m249")
  51.        
  52.         static weap_clip, user_bpammo, weap_ent
  53.         weap_clip = pev(ptr, pev_iuser3)
  54.         user_bpammo = min(cs_get_user_bpammo(ptd, CSW_M249) + pev(ptr, pev_iuser4), 30)
  55.         weap_ent = fm_find_ent_by_owner(-1, "weapon_m249", ptd)
  56.        
  57.         cs_set_weapon_ammo(weap_ent, weap_clip)
  58.         cs_set_user_bpammo(ptd, CSW_M249, user_bpammo)
  59.        
  60.         engfunc(EngFunc_RemoveEntity, ptr)
  61.        
  62.         client_print(ptd, print_chat, "你撿到了一把p_p90.")
  63.        
  64.         return FMRES_IGNORED;
  65. }

  66. public event_cur_weapon(id)
  67. {
  68.         if (!hasp_p90[id])
  69.                 return;
  70.        
  71.         new weap_id, weap_clip, weap_bpammo
  72.         weap_id = get_user_weapon(id, weap_clip, weap_bpammo)
  73.        
  74.         if (weap_id != CSW_M249)
  75.                 return;
  76.        
  77.         set_p_p90_model(id)
  78.         user_clip[id] = weap_clip
  79.         user_bpammo[id] = weap_bpammo
  80.         user_shoot[id] = false
  81. }

  82. public set_p_p90_model(id)
  83. {
  84.         set_pev(id, pev_viewmodel2, p_p90_V_Model)
  85.         set_pev(id, pev_weaponmodel2, p_p90_P_Model)
  86. }

  87. public drop_p_p90(id, store_bpammo, drop_type)
  88. {
  89.         new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  90.        
  91.         if (!pev_valid(ent))return 0;
  92.        
  93.         set_pev(ent, pev_classname, "CS_p_p90")
  94.         set_pev(ent, pev_iuser1, 0) // hasn't bounced yet
  95.         set_pev(ent, pev_solid, SOLID_TRIGGER)
  96.         set_pev(ent, pev_movetype, MOVETYPE_TOSS)
  97.        
  98.         new Float:mins[3] = { -16.0, -16.0, -16.0 }
  99.         new Float:maxs[3] = { 16.0, 16.0, 16.0 }
  100.         engfunc(EngFunc_SetSize, ent, mins, maxs)
  101.        
  102.         set_pev(ent, pev_iuser3, user_clip[id])
  103.        
  104.         if (store_bpammo)
  105.         {
  106.                 set_pev(ent, pev_iuser4, user_bpammo[id])
  107.                 cs_set_user_bpammo(id, CSW_M249, 0)
  108.         }
  109.         else
  110.         {
  111.                 set_pev(ent, pev_iuser4, 0)
  112.         }
  113.        
  114.         new Float:angles[3]
  115.         pev(id, pev_angles, angles)
  116.         angles[0] = angles[2] = 0.0
  117.         set_pev(ent, pev_angles, angles)
  118.        
  119.         engfunc(EngFunc_SetModel, ent, p_p90_W_Model)
  120.        
  121.         new Float:origin[3]
  122.         pev(id, pev_origin, origin)
  123.        
  124.         if (drop_type)
  125.         {
  126.                 new Float:velocity[3]
  127.                 velocity_by_aim(id, 15, velocity)
  128.                 origin[0] += velocity[0]
  129.                 origin[1] += velocity[1]
  130.                 origin[2] += velocity[2]
  131.                 set_pev(ent, pev_origin, origin)
  132.                 velocity_by_aim(id, 400, velocity)
  133.                 set_pev(ent, pev_velocity, velocity)
  134.         }
  135.         else
  136.         {
  137.                 new Float:drop_angle = random_float(0.0, 360.0)
  138.                 origin[0] += 15.0 * floatcos(drop_angle, degrees)
  139.                 origin[1] += 15.0 * floatsin(drop_angle, degrees)
  140.                 set_pev(ent, pev_origin, origin)
  141.         }
  142.        
  143.         return 1;
  144. }

  145. public client_connect(id)
  146. {
  147.         hasp_p90[id] = false
  148. }

  149. public client_disconnect(id)
  150. {
  151.         hasp_p90[id] = false
  152. }

  153. public reset_p_p90()
  154. {
  155.         for (new id = 1; id <= g_maxplayers; id++)
  156.         {
  157.                 if (is_user_connected(id) && is_user_alive(id) && hasp_p90[id] && !user_has_weapon(id, CSW_M249))
  158.                 {
  159.                         hasp_p90[id] = false
  160.                 }
  161.         }
  162. }

  163. stock drop_primary_weapons(id)
  164. {
  165.         static weapons[32], num, i, weaponid
  166.         num = 0 // reset passed weapons count (bugfix)
  167.         get_user_weapons(id, weapons, num)
  168.        
  169.         for (i = 0; i < num; i++)
  170.         {
  171.                 weaponid = weapons[i]
  172.                
  173.                 if ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)
  174.                 {
  175.                         static wname[32]
  176.                         get_weaponname(weaponid, wname, sizeof wname - 1)
  177.                         engclient_cmd(id, "drop", wname)
  178.                 }
  179.         }
  180. }

  181. stock fm_give_item(index, const item[])
  182. {
  183.         if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
  184.                 return 0
  185.        
  186.         new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
  187.         if (!pev_valid(ent))
  188.                 return 0
  189.        
  190.         new Float:origin[3]
  191.         pev(index, pev_origin, origin)
  192.         set_pev(ent, pev_origin, origin)
  193.         set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
  194.         dllfunc(DLLFunc_Spawn, ent)
  195.        
  196.         new save = pev(ent, pev_solid)
  197.         dllfunc(DLLFunc_Touch, ent, index)
  198.         if (pev(ent, pev_solid) != save)
  199.                 return ent
  200.        
  201.         engfunc(EngFunc_RemoveEntity, ent)
  202.        
  203.         return -1
  204. }

  205. stock bool:has_custom_weapons(id, const bitsum)
  206. {
  207.         static weapons[32], num, i, weaponid
  208.         num = 0 // reset passed weapons count (bugfix)
  209.         get_user_weapons(id, weapons, num)
  210.        
  211.         for (i = 0; i < num; i++)
  212.         {
  213.                 weaponid = weapons[i]
  214.                
  215.                 if ((1<<weaponid) & bitsum)
  216.                         return true;
  217.         }
  218.        
  219.         return false;
  220. }

  221. stock fm_find_ent_by_owner(entity, const classname[], owner)
  222. {
  223.         while ((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", classname)) && (pev(entity, pev_owner) != owner)) {}
  224.        
  225.         return entity;
  226. }

  227. stock fm_find_ent_by_class(index, const classname[])
  228. {
  229.         return engfunc(EngFunc_FindEntityByString, index, "classname", classname)
  230. }

  231. stock fm_kill_entity(index)
  232. {
  233.         set_pev(index, pev_flags, pev(index, pev_flags) | FL_KILLME);
  234.        
  235.         return 1;
  236. }

  237. stock Float:get_weapon_next_pri_attack(entity)
  238. {
  239.         return get_pdata_float(entity, OFFSET_FlNextPrimaryAttack, OFFSET_LINUX_WEAPONS)
  240. }

  241. stock set_weapon_next_pri_attack(entity, Float:time)
  242. {
  243.         set_pdata_float(entity, OFFSET_FlNextPrimaryAttack, time, OFFSET_LINUX_WEAPONS)
  244. }

  245. stock fm_get_aim_vector(index, forward_distance, Float:forward_origin[3], Float:view_end_origin[3])
  246. {
  247.         new Float:start[3], Float:view_ofs[3]
  248.         pev(index, pev_origin, start);
  249.         pev(index, pev_view_ofs, view_ofs);
  250.         xs_vec_add(start, view_ofs, start);
  251.        
  252.         new Float:vector[3], Float:temp[3];
  253.         pev(index, pev_v_angle, vector);
  254.         engfunc(EngFunc_MakeVectors, vector);
  255.         global_get(glb_v_forward, vector);
  256.         xs_vec_mul_scalar(vector, float(forward_distance), temp);
  257.         xs_vec_add(start, temp, forward_origin);
  258.        
  259.         new Float:dest[3]
  260.         xs_vec_mul_scalar(vector, 9999.0, temp);
  261.         xs_vec_add(start, temp, dest);
  262.         engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
  263.         get_tr2(0, TR_vecEndPos, view_end_origin);
  264.        
  265.         return 1;
  266. }

  267. #if defined SUPPORT_CZBOT
  268. // CZBot support
  269. public client_putinserver(id)
  270. {
  271.         if (!cvar_botquota || !is_user_bot(id) || BotHasDebug)
  272.                 return;
  273.        
  274.         new classname[32]
  275.         pev(id, pev_classname, classname, 31)
  276.        
  277.         if (!equal(classname, "player"))
  278.                 set_task(0.1, "_Debug", id)
  279. }
  280. public _Debug(id)
  281. {
  282.         // Make sure it's a CZ bot and it's still connected
  283.         if (!get_pcvar_num(cvar_botquota) || !is_user_connected(id))
  284.                 return;
  285.        
  286.         BotHasDebug = true
  287.         RegisterHamFromEntity(Ham_TakeDamage, id, "fw_Player_TakeDamage")
  288.         RegisterHamFromEntity(Ham_TraceAttack, id, "fw_Player_TraceAttack")
  289. }
复制代码
回复

使用道具 举报

发表于 2011-8-18 13:13:11 | 显示全部楼层 来自 中国–上海–上海
MDL文件有么
回复

使用道具 举报

 楼主| 发表于 2011-8-18 14:13:19 | 显示全部楼层 来自 中国–江苏–盐城–建湖县
已经发了
回复

使用道具 举报

发表于 2011-8-25 10:00:01 | 显示全部楼层 来自 中国–北京–北京
我有这个插件!联系qq71466322
回复

使用道具 举报

发表于 2011-9-1 09:41:35 | 显示全部楼层 来自 中国–山东
我有这个插件!联系qq71466322
sanshi1978 发表于 2011-8-25 10:00



有可以放上来啊 大家去下载多好
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表