hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2025.06.15. 21:15



Jelenlévő felhasználók

Jelenleg 359 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 358 vendég

A legtöbb felhasználó (2761 fő) 2025.01.09. 20:06-kor tartózkodott itt.

Regisztrált felhasználók: Bing [Bot]az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása Hozzászólás a témához  [2 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: [ZP] Extra cuc: Shotgun
HozzászólásElküldve:2013.06.03. 22:01 
Offline
Minden6ó
Avatar

Csatlakozott:2011.01.19. 12:14
Hozzászólások:4294
Megköszönt másnak: 219 alkalommal
Megköszönték neki: 289 alkalommal
Hali! Valaki ki javítana nekem?
Kód:
[AMXX] Invalid Plugin (plugin "zp_extra_shotgun.amxx")

SMA Forráskód: [ Mindet kijelol ]
  1. /*================================================================================
  2.  
  3.  
  4.  
  5. [ZP] Extra Item: Sawn-Off Shotgun
  6.  
  7. Copyright (C) 2009 by meTaLiCroSS
  8.  
  9. Request maded by Clear
  10.  
  11.  
  12.  
  13. This program is free software: you can redistribute it and/or modify
  14.  
  15. it under the terms of the GNU General Public License as published by
  16.  
  17. the Free Software Foundation, either version 3 of the License, or
  18.  
  19. (at your option) any later version.
  20.  
  21.  
  22.  
  23. This program is distributed in the hope that it will be useful,
  24.  
  25. but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  
  27. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28.  
  29. GNU General Public License for more details.
  30.  
  31.  
  32.  
  33. You should have received a copy of the GNU General Public License
  34.  
  35. along with this program. If not, see <http://www.gnu.org/licenses/>.
  36.  
  37.  
  38.  
  39. In addition, as a special exception, the author gives permission to
  40.  
  41. link the code of this program with the Half-Life Game Engine ("HL
  42.  
  43. Engine") and Modified Game Libraries ("MODs") developed by Valve,
  44.  
  45. L.L.C ("Valve"). You must obey the GNU General Public License in all
  46.  
  47. respects for all of the code used other than the HL Engine and MODs
  48.  
  49. from Valve. If you modify this file, you may extend this exception
  50.  
  51. to your version of the file, but you are not obligated to do so. If
  52.  
  53. you do not wish to do so, delete this exception statement from your
  54.  
  55. version.
  56.  
  57.  
  58.  
  59. =================================================================================*/
  60.  
  61.  
  62.  
  63. #include <amxmodx>
  64.  
  65. #include <fakemeta>
  66.  
  67. #include <engine>
  68.  
  69. #include <hamsandwich>
  70.  
  71. #include <xs>
  72.  
  73. #include <zombieplague>
  74.  
  75.  
  76.  
  77. /*================================================================================
  78.  
  79.  [Customization]
  80.  
  81. =================================================================================*/
  82.  
  83.  
  84.  
  85. // Item Cost
  86.  
  87. new const g_SawnOff_Cost = 30
  88.  
  89.  
  90.  
  91. // Models
  92.  
  93. new const sawnoff_model_v[] = "models/v_sawn_off_shotgun.mdl"
  94.  
  95. new const sawnoff_model_p[] = "models/p_sawn_off_shotgun.mdl"
  96.  
  97. new const sawnoff_model_w[] = "models/w_sawn_off_shotgun.mdl"
  98.  
  99.  
  100.  
  101. // ---------------------------------------------------------------
  102.  
  103. // ------------------ Customization ends here!! ------------------
  104.  
  105. // ---------------------------------------------------------------
  106.  
  107.  
  108.  
  109. // Offsets
  110.  
  111. #if cellbits == 32
  112.  
  113. const OFFSET_CLIPAMMO = 51
  114.  
  115. #else
  116.  
  117. const OFFSET_CLIPAMMO = 65
  118.  
  119. #endif
  120.  
  121. const OFFSET_LINUX = 5
  122.  
  123. const OFFSET_LINUX_WEAPONS = 4
  124.  
  125. const OFFSET_LASTPRIMARYITEM = 368
  126.  
  127.  
  128.  
  129. // Version
  130.  
  131. #define VERSION "0.4.5"
  132.  
  133.  
  134.  
  135. // Arrays
  136.  
  137. new g_sawnoff_shotgun[33], g_currentweapon[33]
  138.  
  139.  
  140.  
  141. // Variables
  142.  
  143. new g_SawnOff, g_MaxPlayers
  144.  
  145.  
  146.  
  147. // Cvar Pointers
  148.  
  149. new cvar_enable, cvar_oneround, cvar_knockback, cvar_knockbackpower, cvar_uclip, cvar_damage
  150.  
  151.  
  152.  
  153. /*================================================================================
  154.  
  155.  [Init and Precache]
  156.  
  157. =================================================================================*/
  158.  
  159.  
  160.  
  161. public plugin_init()
  162.  
  163. {
  164.  
  165. // Plugin Info
  166.  
  167. register_plugin("[ZP] Extra Item: Sawn-Off Shotgun", VERSION, "meTaLiCroSS")
  168.  
  169.  
  170.  
  171. // Ham Forwards
  172.  
  173. RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
  174.  
  175. RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
  176.  
  177. RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  178.  
  179.  
  180.  
  181. // Fakemeta Forwards
  182.  
  183. register_forward(FM_SetModel, "fw_SetModel")
  184.  
  185.  
  186.  
  187. // Event: Round Start
  188.  
  189. register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
  190.  
  191.  
  192.  
  193. // Message: Cur Weapon
  194.  
  195. register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")
  196.  
  197.  
  198.  
  199. // CVARS
  200.  
  201. register_cvar("zp_extra_sawnoff", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
  202.  
  203. cvar_enable = register_cvar("zp_sawnoff_enable", "1")
  204.  
  205. cvar_uclip = register_cvar("zp_sawnoff_unlimited_clip", "1")
  206.  
  207. cvar_damage = register_cvar("zp_sawnoff_damage_mult", "4.0")
  208.  
  209. cvar_oneround = register_cvar("zp_sawnoff_oneround", "0")
  210.  
  211. cvar_knockback = register_cvar("zp_sawnoff_knockback", "1")
  212.  
  213. cvar_knockbackpower = register_cvar("zp_sawnoff_kbackpower", "10.0")
  214.  
  215.  
  216.  
  217. // Variables
  218.  
  219. g_MaxPlayers = get_maxplayers()
  220.  
  221. g_SawnOff = zp_register_extra_item("Sawn-Off Shotgun", g_SawnOff_Cost, ZP_TEAM_HUMAN)
  222.  
  223.  
  224.  
  225. }
  226.  
  227.  
  228.  
  229. public plugin_precache()
  230.  
  231. {
  232.  
  233. // Precaching models
  234.  
  235. precache_model(sawnoff_model_v)
  236.  
  237. precache_model(sawnoff_model_p)
  238.  
  239. precache_model(sawnoff_model_w)
  240.  
  241. }
  242.  
  243.  
  244.  
  245. /*================================================================================
  246.  
  247.  [Main Functions]
  248.  
  249. =================================================================================*/
  250.  
  251.  
  252.  
  253. // Round Start Event
  254.  
  255. public event_round_start()
  256.  
  257. {
  258.  
  259. // Get all the players
  260.  
  261. for(new id = 1; id <= g_MaxPlayers; id++)
  262.  
  263. {
  264.  
  265. // Check
  266.  
  267. if(get_pcvar_num(cvar_oneround) || !get_pcvar_num(cvar_enable))
  268.  
  269. {
  270.  
  271. // Striping Sawn Off
  272.  
  273. if(g_sawnoff_shotgun[id])
  274.  
  275. {
  276.  
  277. g_sawnoff_shotgun[id] = false;
  278.  
  279. ham_strip_weapon(id, "weapon_m3")
  280.  
  281. }
  282.  
  283. }
  284.  
  285. }
  286.  
  287. }
  288.  
  289.  
  290.  
  291. // Message Current Weapon
  292.  
  293. public message_cur_weapon(msg_id, msg_dest, id)
  294.  
  295. {
  296.  
  297. // Doesn't have a Sawn Off
  298.  
  299. if (!g_sawnoff_shotgun[id])
  300.  
  301. return PLUGIN_CONTINUE
  302.  
  303.  
  304.  
  305. // Isn't alive / not active weapon
  306.  
  307. if (!is_user_alive(id) || get_msg_arg_int(1) != 1)
  308.  
  309. return PLUGIN_CONTINUE
  310.  
  311.  
  312.  
  313. // Get Weapon Clip
  314.  
  315. new clip = get_msg_arg_int(3)
  316.  
  317.  
  318.  
  319. // Update Weapon Array
  320.  
  321. g_currentweapon[id] = get_msg_arg_int(2) // get weapon ID
  322.  
  323.  
  324.  
  325. // Weapon isn't M3
  326.  
  327. if(g_currentweapon[id] != CSW_M3)
  328.  
  329. return PLUGIN_CONTINUE;
  330.  
  331.  
  332.  
  333. // Replace Models
  334.  
  335. entity_set_string(id, EV_SZ_viewmodel, sawnoff_model_v)
  336.  
  337. entity_set_string(id, EV_SZ_weaponmodel, sawnoff_model_p)
  338.  
  339.  
  340.  
  341. // Check cvar
  342.  
  343. if(get_pcvar_num(cvar_uclip))
  344.  
  345. {
  346.  
  347. // Set Ammo HUD in 8
  348.  
  349. set_msg_arg_int(3, get_msg_argtype(3), 8)
  350.  
  351.  
  352.  
  353. // Check clip if more than 2
  354.  
  355. if (clip < 2)
  356.  
  357. {
  358.  
  359. // Update weapon ammo
  360.  
  361. fm_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m3", id), 8)
  362.  
  363. }
  364.  
  365. }
  366.  
  367.  
  368.  
  369. return PLUGIN_CONTINUE;
  370.  
  371. }
  372.  
  373.  
  374.  
  375. // Touch fix (when user drop the Sawn off, already has the Sawn off.
  376.  
  377. public touch_fix(id)
  378.  
  379. {
  380.  
  381. if(g_sawnoff_shotgun[id])
  382.  
  383. g_sawnoff_shotgun[id] = false;
  384.  
  385. }
  386.  
  387.  
  388.  
  389. /*================================================================================
  390.  
  391.  [Main Forwards]
  392.  
  393. =================================================================================*/
  394.  
  395.  
  396.  
  397. public fw_PlayerKilled(victim, attacker, shouldgib)
  398.  
  399. {
  400.  
  401. // Victim has a Sawn off
  402.  
  403. if(g_sawnoff_shotgun[victim])
  404.  
  405. g_sawnoff_shotgun[victim] = false;
  406.  
  407. }
  408.  
  409.  
  410.  
  411. public fw_SetModel(entity, model[])
  412.  
  413. {
  414.  
  415. // Entity is not valid
  416.  
  417. if(!is_valid_ent(entity))
  418.  
  419. return FMRES_IGNORED;
  420.  
  421.  
  422.  
  423. // Entity model is not a M3
  424.  
  425. if(!equali(model, "models/w_m3.mdl"))
  426.  
  427. return FMRES_IGNORED;
  428.  
  429.  
  430.  
  431. // Get owner and entity classname
  432.  
  433. new owner = entity_get_edict(entity, EV_ENT_owner)
  434.  
  435. new classname[33]
  436.  
  437. entity_get_string(entity, EV_SZ_classname, classname, charsmax(classname))
  438.  
  439.  
  440.  
  441. // Entity classname is a weaponbox
  442.  
  443. if(equal(classname, "weaponbox"))
  444.  
  445. {
  446.  
  447. // The weapon owner has a Sawn Off
  448.  
  449. if(g_sawnoff_shotgun[owner])
  450.  
  451. {
  452.  
  453. // Striping Sawn off and set New Model
  454.  
  455. g_sawnoff_shotgun[owner] = false;
  456.  
  457. entity_set_model(entity, sawnoff_model_w)
  458.  
  459. set_task(0.1, "touch_fix", owner)
  460.  
  461.  
  462.  
  463. return FMRES_SUPERCEDE
  464.  
  465. }
  466.  
  467. }
  468.  
  469.  
  470.  
  471. return FMRES_IGNORED
  472.  
  473.  
  474.  
  475. }
  476.  
  477.  
  478.  
  479. public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
  480.  
  481. {
  482.  
  483. // Attacker isn't a Player (1 in 32)
  484.  
  485. if(!(1 <= attacker <= g_MaxPlayers))
  486.  
  487. return HAM_IGNORED;
  488.  
  489.  
  490.  
  491. // Attacker's weapon isn't a M3
  492.  
  493. if(g_currentweapon[attacker] != CSW_M3)
  494.  
  495. return HAM_IGNORED;
  496.  
  497.  
  498.  
  499. // User doesn't have a Sawn Off
  500.  
  501. if(!g_sawnoff_shotgun[attacker])
  502.  
  503. return HAM_IGNORED;
  504.  
  505.  
  506.  
  507. SetHamParamFloat(4, damage * get_pcvar_float(cvar_damage) )
  508.  
  509.  
  510.  
  511. return HAM_IGNORED;
  512.  
  513. }
  514.  
  515.  
  516.  
  517. public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
  518.  
  519. {
  520.  
  521. // Player is allowed to make a Knockback
  522.  
  523. if(!allowed_knockback(victim, attacker))
  524.  
  525. return HAM_IGNORED;
  526.  
  527.  
  528.  
  529. // Check damage type
  530.  
  531. if(!(damage_type & DMG_BULLET))
  532.  
  533. return HAM_IGNORED;
  534.  
  535.  
  536.  
  537. // Make Knockback...
  538.  
  539. new Float:velocity[3]; pev(victim, pev_velocity, velocity)
  540.  
  541. xs_vec_mul_scalar(direction, get_pcvar_float(cvar_knockbackpower), direction)
  542.  
  543. xs_vec_add(velocity, direction, direction)
  544.  
  545. entity_set_vector(victim, EV_VEC_velocity, direction)
  546.  
  547.  
  548.  
  549. return HAM_IGNORED;
  550.  
  551.  
  552.  
  553. }
  554.  
  555.  
  556.  
  557. public pfn_touch(entity, toucher)
  558.  
  559. {
  560.  
  561. new model[33], toucherclass[33], entityclass[33]
  562.  
  563.  
  564.  
  565. // Get toucher Classname
  566.  
  567. if((toucher > 0) && is_valid_ent(toucher)) entity_get_string(toucher, EV_SZ_classname, toucherclass, charsmax(toucherclass))
  568.  
  569.  
  570.  
  571. // Get entity Classname
  572.  
  573. if((entity > 0) && is_valid_ent(entity)) entity_get_string(entity, EV_SZ_classname, entityclass, charsmax(entityclass))
  574.  
  575.  
  576.  
  577. // Now check if is a Weapon and is a Player
  578.  
  579. if(equali(toucherclass, "player") && equali(entityclass, "weaponbox"))
  580.  
  581. {
  582.  
  583. // Get Model
  584.  
  585. entity_get_string(entity, EV_SZ_model, model, charsmax(model))
  586.  
  587.  
  588.  
  589. // Check Model
  590.  
  591. if(equali(model, sawnoff_model_w))
  592.  
  593. if(allowed_touch(toucher)) // Player is allowed to pickup the weapon
  594.  
  595. g_sawnoff_shotgun[toucher] = true // Set Weapon
  596.  
  597. }
  598.  
  599. }
  600.  
  601.  
  602.  
  603. /*================================================================================
  604.  
  605.  [Internal Functions]
  606.  
  607. =================================================================================*/
  608.  
  609.  
  610.  
  611. allowed_knockback(victim, attacker)
  612.  
  613. {
  614.  
  615. // Obviously, doesn't is allowed to be Knockbacked (WTF)
  616.  
  617. if(!g_sawnoff_shotgun[attacker] || !get_pcvar_num(cvar_knockback) || g_currentweapon[attacker] != CSW_M3 || !zp_get_user_zombie(victim))
  618.  
  619. return false;
  620.  
  621.  
  622.  
  623. return true;
  624.  
  625. }
  626.  
  627.  
  628.  
  629. allowed_touch(toucher)
  630.  
  631. {
  632.  
  633. // Can't touch the Weapon
  634.  
  635. if(zp_get_user_survivor(toucher) || zp_get_user_zombie(toucher) || fm_get_user_lastprimaryitem(toucher) || g_sawnoff_shotgun[toucher])
  636.  
  637. return false;
  638.  
  639.  
  640.  
  641. return true;
  642.  
  643. }
  644.  
  645.  
  646.  
  647. /*================================================================================
  648.  
  649.  [Zombie Plague Forwards]
  650.  
  651. =================================================================================*/
  652.  
  653.  
  654.  
  655. public zp_extra_item_selected(id, itemid)
  656.  
  657. {
  658.  
  659. // Item is the Sawn-Off
  660.  
  661. if(itemid == g_SawnOff)
  662.  
  663. {
  664.  
  665. if(!get_pcvar_num(cvar_enable))
  666.  
  667. {
  668.  
  669. zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + g_SawnOff_Cost)
  670.  
  671. client_print(id, print_chat, "[ZP] The Sawn-Off Shotgun is Disabled")
  672.  
  673.  
  674.  
  675. return;
  676.  
  677. }
  678.  
  679.  
  680.  
  681. // Already has an M3
  682.  
  683. if(g_sawnoff_shotgun[id] && user_has_weapon(id, CSW_M3))
  684.  
  685. {
  686.  
  687. zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + g_SawnOff_Cost)
  688.  
  689. client_print(id, print_chat, "[ZP] You already have a Sawn-Off Shotgun")
  690.  
  691.  
  692.  
  693. return;
  694.  
  695. }
  696.  
  697.  
  698.  
  699. // Array
  700.  
  701. g_sawnoff_shotgun[id] = true
  702.  
  703.  
  704.  
  705. // Weapon
  706.  
  707. ham_give_weapon(id, "weapon_m3")
  708.  
  709.  
  710.  
  711. // Message
  712.  
  713. client_print(id, print_chat, "[ZP] You now have a Sawn-Off Shotgun")
  714.  
  715.  
  716.  
  717. }
  718.  
  719. }
  720.  
  721.  
  722.  
  723. public zp_user_infected_post(infected, infector)
  724.  
  725. {
  726.  
  727. // Infected has a M3
  728.  
  729. if(g_sawnoff_shotgun[infected])
  730.  
  731. g_sawnoff_shotgun[infected] = false;
  732.  
  733. }
  734.  
  735.  
  736.  
  737. public zp_user_humanized_post(player)
  738.  
  739. {
  740.  
  741. // Is Survivor
  742.  
  743. if(zp_get_user_survivor(player) && g_sawnoff_shotgun[player])
  744.  
  745. g_sawnoff_shotgun[player] = false;
  746.  
  747. }
  748.  
  749.  
  750.  
  751. /*================================================================================
  752.  
  753.  [Stocks]
  754.  
  755. =================================================================================*/
  756.  
  757.  
  758.  
  759. stock ham_give_weapon(id, weapon[])
  760.  
  761. {
  762.  
  763. if(!equal(weapon,"weapon_",7))
  764.  
  765. return 0
  766.  
  767.  
  768.  
  769. new wEnt = create_entity(weapon)
  770.  
  771.  
  772.  
  773. if(!is_valid_ent(wEnt))
  774.  
  775. return 0
  776.  
  777.  
  778.  
  779. entity_set_int(wEnt, EV_INT_spawnflags, SF_NORESPAWN)
  780.  
  781. DispatchSpawn(wEnt)
  782.  
  783.  
  784.  
  785. if(!ExecuteHamB(Ham_AddPlayerItem,id,wEnt))
  786.  
  787. {
  788.  
  789. if(is_valid_ent(wEnt)) entity_set_int(wEnt, EV_INT_flags, entity_get_int(wEnt, EV_INT_flags) | FL_KILLME)
  790.  
  791. return 0
  792.  
  793. }
  794.  
  795.  
  796.  
  797. ExecuteHamB(Ham_Item_AttachToPlayer,wEnt,id)
  798.  
  799. return 1
  800.  
  801. }
  802.  
  803.  
  804.  
  805. stock ham_strip_weapon(id, weapon[])
  806.  
  807. {
  808.  
  809. if(!equal(weapon,"weapon_",7))
  810.  
  811. return 0
  812.  
  813.  
  814.  
  815. new wId = get_weaponid(weapon)
  816.  
  817.  
  818.  
  819. if(!wId) return 0
  820.  
  821.  
  822.  
  823. new wEnt
  824.  
  825.  
  826.  
  827. while((wEnt = find_ent_by_class(wEnt, weapon)) && entity_get_edict(wEnt, EV_ENT_owner) != id) {}
  828.  
  829.  
  830.  
  831. if(!wEnt) return 0
  832.  
  833.  
  834.  
  835. if(get_user_weapon(id) == wId)
  836.  
  837. ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);
  838.  
  839.  
  840.  
  841. if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt))
  842.  
  843. return 0
  844.  
  845.  
  846.  
  847. ExecuteHamB(Ham_Item_Kill, wEnt)
  848.  
  849.  
  850.  
  851. entity_set_int(id, EV_INT_weapons, entity_get_int(id, EV_INT_weapons) & ~(1<<wId))
  852.  
  853.  
  854.  
  855. return 1
  856.  
  857. }
  858.  
  859.  
  860.  
  861. stock fm_set_weapon_ammo(entity, amount)
  862.  
  863. {
  864.  
  865. set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
  866.  
  867. }
  868.  
  869.  
  870.  
  871. stock fm_get_user_lastprimaryitem(id) // Thanks to joaquimandrade
  872.  
  873. {
  874.  
  875. if(get_pdata_cbase(id, OFFSET_LASTPRIMARYITEM) != -1)
  876.  
  877. return 1;
  878.  
  879.  
  880.  
  881. return 0;
  882.  
  883. }
  884.  
  885.  

_________________
<<eb@>>Team Website - Közösség
17Buddies - Általam készített pályák.
GameBanana - Általam készített pályák/vágott hangok.

Kép
Kép


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: [ZP] Extra cuc: Shotgun
HozzászólásElküldve:2013.06.03. 22:13 
Offline
Tiszteletbeli
Avatar

Csatlakozott:2011.09.18. 13:01
Hozzászólások:4274
Megköszönt másnak: 55 alkalommal
Megköszönték neki: 515 alkalommal
Attol esetleg tobb hibat irhatnal :)Debugold be.

_________________
Idk. Csak ugy funbooo.
Kép


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése: Rendezés 
Új téma nyitása Hozzászólás a témához  [2 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 3 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole