въпросче, за шоп магазин

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
Marinovv
Извън линия
Потребител
Потребител
Мнения: 511
Регистриран на: 19 Сеп 2017, 10:01
Местоположение: България
Се отблагодари: 530 пъти
Получена благодарност: 13 пъти
Обратна връзка:

въпросче, за шоп магазин

Мнение от Marinovv » 03 Мар 2018, 15:10

Здравейте. Искам сега да ме въведете леко в скриптирането и как по точно да настройвам даден плъгин, за шоп магазина на OcixCrom.

Примерно ето един прост, за рестартиране на точките, който опитах аз лично да настроя, за магазина:

Код за потвърждение: Избери целия код

/*
   This is a simple plugin I made that will just restart a players score
   making their deaths and kills set to 0, this is to help players out a
   little bit because they no longer have to reconnect or retry if they
   want their score to start over, they can just type a simple command
   
      ---------------------------------
       --------- MADE BY SILENTTT -----
        ------ MADE BY SILENTTT ------
         --  MADE BY SILENTTT -------
        ------ MADE BY SILENTTT ------
       --------- MADE BY SILENTTT -----
      ---------------------------------
*/

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <colorchat>
#include <customshop>

#define PLUGIN_VERSION "4.x"

additem ITEM_RESETSCORE
new bool:g_bHasItem[33]

#define adtime	 600.0 //Default of 10 minuites

new pcvar_Display

public plugin_init()
{
	register_plugin("Crom's ResetScore", PLUGIN_VERSION, "OciXCrom")
	
	//You may type /resetscore or /restartscore
	register_clcmd("say /resetscore", "reset_score")
	register_clcmd("say /restartscore", "reset_score")
	register_clcmd("say /rs", "reset_score")
	
	//This command by default will be set at 0
	//Change it to 1 in server.cfg if you want
	//A message to be shown to advertise this.
	//This command by default is also 0
	//Change it to 1 in server.cfg if you want
	//It to show who reset their scores when they do it
	pcvar_Display = register_cvar("sv_rsdisplay", "0")
	
	if(get_cvar_num("sv_rsadvertise") == 1)
	{
		set_task(adtime, "advertise", _, _, _, "b")
	}
}

public plugin_precache()
	ITEM_RESETSCORE = cshop_register_item("resetscore", "Resec Score | Frags", 40)
	
public cshop_item_selected(id, iItem)
{
	if(iItem == ITEM_RESETSCORE)
		g_bHasItem[id] = true
}

public cshop_item_removed(id, iItem)
{
	if(iItem == ITEM_RESETSCORE)
		g_bHasItem[id] = false
}

public client_putinserver(id)
	g_bHasItem[id] = false

public reset_score(id)
{
	//These both NEED to be done twice, otherwise your frags wont
	//until the next round
	cs_set_user_deaths(id, 0)
	set_user_frags(id, 0)
	cs_set_user_deaths(id, 0)
	set_user_frags(id, 0)
	
	if(get_pcvar_num(pcvar_Display) == 1)
	{
		new name[33]
		get_user_name(id, name, 32)
		ColorChat(0, GREY, "^4%s ^3tuko shto anulira rezultata si.", name)
	}
	else
	{
		client_print(id, print_chat, "^1Vie toku-shto ste nulirali rezultata si")
	}
	return PLUGIN_HANDLED
}
Не ми трябва този плъгин, но исках да видя как става това. Схванах основната тактика как се вкарва в шопа даден итем, но на всички итеми, които иам в шопа всичко е различно.

Не разбирам примерно е вижте пък този итем, за парашут как е с друг код:

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <customshop>
#include <fakemeta>
#include <hamsandwich>

#define _PLUGIN         "[ZP] Parachute"
#define _VERSION             "1.1"
#define _AUTHOR           "H.RED.ZONE"

#define PARACHUTE_MODEL "models/parachute.mdl"

#define MarkUserHasParachute(%0)	g_bitHasParachute |= (1<<(%0&31))
#define ClearUserHasParachute(%0)	g_bitHasParachute &= ~(1<<(%0&31))
#define HasUserParachute(%0)		g_bitHasParachute & (1<<(%0&31))
#define MAX_PLAYERS 32

new g_bitHasParachute

new g_iUserParachute[MAX_PLAYERS+1]

new bool:g_blCanUse[MAX_PLAYERS+1]

new Float:g_flEntityFrame[MAX_PLAYERS+1]

new g_iModelIndex
new g_pCvarFallSpeed
additem ITEM_PARACHUTE

new const PARACHUTE_CLASS[] = "parachute"

enum {
	deploy,
	idle,
	detach
}

public plugin_init() {
	register_plugin(_PLUGIN, _VERSION, _AUTHOR)

	g_pCvarFallSpeed = register_cvar("parachute_fallspeed", "30")

	register_forward( FM_CmdStart, "fw_Start" )
	
	RegisterHam(Ham_Spawn, "player", "Ham_CBasePlayer_Spawn_Post", 1)
	RegisterHam(Ham_Killed, "player", "Ham_CBasePlayer_Killed_Post", 1)
}

public plugin_precache() {
	g_iModelIndex = precache_model(PARACHUTE_MODEL)
	ITEM_PARACHUTE = cshop_register_item("parachute", "Parachute", 1000)
}

public cshop_item_selected(id, iItem)
{
    if(iItem == ITEM_PARACHUTE)
        g_blCanUse[id] = true
}

public cshop_item_removed(id, iItem)
{
    if(iItem == ITEM_PARACHUTE)
        g_blCanUse[id] = false
}

public client_putinserver(id) {
	if( HasUserParachute(id) ) {
		new iEnt = g_iUserParachute[id]
		if( iEnt ) {
			RemoveUserParachute(id, iEnt)
		}
		ClearUserHasParachute(id)
	}
}

public client_disconnect(id) {
	if( HasUserParachute(id) ) {
		new iEnt = g_iUserParachute[id]
		if( iEnt ) {
			RemoveUserParachute(id, iEnt)
		}
		ClearUserHasParachute(id)
	}
}

public Ham_CBasePlayer_Killed_Post( id ) {
	if( HasUserParachute(id) ) {
		new iEnt = g_iUserParachute[id]
		if( iEnt ) {
			RemoveUserParachute(id, iEnt)
		}
		ClearUserHasParachute(id)
	}
}

public Ham_CBasePlayer_Spawn_Post(id) {
	if( is_user_alive(id) ) {
		if( HasUserParachute(id) ) {
			new iEnt = g_iUserParachute[id]
			if( iEnt ) {
				RemoveUserParachute(id, iEnt)
			}
		}
		MarkUserHasParachute(id)
	}
}

RemoveUserParachute(id, iEnt) {
	engfunc(EngFunc_RemoveEntity, iEnt)
	g_iUserParachute[id] = 0
}

CreateParachute(id) {
	static iszInfoTarget
	if( !iszInfoTarget ) {
		iszInfoTarget = engfunc(EngFunc_AllocString, "info_target")
	}

	new iEnt = engfunc(EngFunc_CreateNamedEntity, iszInfoTarget)
	if( iEnt > 0) {
		static iszClass = 0
		if( !iszClass ) {
			iszClass = engfunc(EngFunc_AllocString, PARACHUTE_CLASS)
		}
		set_pev_string(iEnt, pev_classname, iszClass)
		set_pev(iEnt, pev_aiment, id)
		set_pev(iEnt, pev_owner, id)
		set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW)

		static iszModel = 0
		if( !iszModel ) {
			iszModel = engfunc(EngFunc_AllocString, PARACHUTE_MODEL)
		}
		set_pev_string(iEnt, pev_model, iszModel)
		set_pev(iEnt, pev_modelindex, g_iModelIndex)

		set_pev(iEnt, pev_sequence, deploy)
		set_pev(iEnt, pev_gaitsequence, 1)
		set_pev(iEnt, pev_frame, 0.0)
		g_flEntityFrame[id] = 0.0
		g_iUserParachute[id] = iEnt
		MarkUserHasParachute(id)
		new Float:fVecOrigin[3]
		pev(id, pev_origin, fVecOrigin)
		
		return iEnt
	}
	return 0
}

public fw_Start(id) {
	if( ~HasUserParachute(id) || !is_user_alive(id) || !g_blCanUse[id] ) {
		return
	}

	new Float:flFrame
	new iEnt = g_iUserParachute[id]

	if(iEnt > 0 && pev(id, pev_flags) & FL_ONGROUND) {

		if( pev(iEnt, pev_sequence) != detach ) {
			set_pev(iEnt, pev_sequence, detach)
			set_pev(iEnt, pev_gaitsequence, 1)
			set_pev(iEnt, pev_frame, 0.0)
			g_flEntityFrame[id] = 0.0
			set_pev(iEnt, pev_animtime, 0.0)
			set_pev(iEnt, pev_framerate, 0.0)
			return
		}

		pev(iEnt, pev_frame, flFrame)
		if( flFrame > 252.0 ) {
			RemoveUserParachute(id, iEnt)
			return
		}

		flFrame += 2.0

		g_flEntityFrame[id] = flFrame
		set_pev(iEnt, pev_frame, flFrame)

		return
	}

	if( pev(id, pev_button) & IN_USE ) {
		new Float:fVecVelocity[3], Float:fVelocity_z
		pev(id, pev_velocity, fVecVelocity)
		fVelocity_z = fVecVelocity[2]

		if( fVelocity_z < 0.0 ) {
			if(iEnt <= 0) {
				iEnt = CreateParachute(id)
			}

			fVelocity_z = floatmin(fVelocity_z + 15.0, -get_pcvar_float(g_pCvarFallSpeed))
			fVecVelocity[2] = fVelocity_z
			set_pev(id, pev_velocity, fVecVelocity)

			if( pev(iEnt, pev_sequence) == deploy ) {
				flFrame = g_flEntityFrame[id]++

				if( flFrame > 100.0 ) {
					set_pev(iEnt, pev_animtime, 0.0)
					set_pev(iEnt, pev_framerate, 0.4)
					set_pev(iEnt, pev_sequence, idle)
					set_pev(iEnt, pev_gaitsequence, 1)
					set_pev(iEnt, pev_frame, 0.0)
					g_flEntityFrame[id] = 0.0
				}
				else {
					set_pev(iEnt, pev_frame, flFrame)
				}
			}
		}
		else if(iEnt > 0) {
			RemoveUserParachute(id, iEnt)
		}
	}
	else if( iEnt > 0 && pev(id, pev_oldbuttons) & IN_USE ) {
		RemoveUserParachute(id, iEnt)
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang10266\\ f0\\ fs16 \n\\ par }
*/
мисълта ми как да разбера примерно, за онзи горния ресет скор какво да добавя, за да работи, за шопа.

Въведете ме малко в тия неща моля. :)
Последно промяна от OciXCrom на 03 Мар 2018, 15:28, променено общо 1 път.
Причина: Преместена тема!
Иван Маринов,

лицензиран оператор и пилот на професионални дронове клас C1 за всички държави в EU.

DJI Mavic 3 Classic | DJI Mavic 3 PRO - погледни света от различна перспектива.

Последвайте ме във Facebook

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

въпросче, за шоп магазин

Мнение от OciXCrom » 03 Мар 2018, 15:28

Просто трябва да знаеш, че функцията cshop_item_selected се извиква когато играч се опита да закупи предмет, съответно в нея трябва да вмъкнеш функцията която рестартира резултата, в случая reset_score(id). Естествено трябва да премахнеш командите за /rs, за да може да се ползва само от магазина. cshop_item_removed се извиква при премахване на даден предмет. При този плъгин няма какво да се прави когато предметът се премахне, съответно не добавяш тази част.

Аватар
Marinovv
Извън линия
Потребител
Потребител
Мнения: 511
Регистриран на: 19 Сеп 2017, 10:01
Местоположение: България
Се отблагодари: 530 пъти
Получена благодарност: 13 пъти
Обратна връзка:

въпросче, за шоп магазин

Мнение от Marinovv » 03 Мар 2018, 16:13

Аа тъй ли било бе. Сега схванах бая и много ти благодаря. Само последно въпросче в cshop_item_selected къде се вкарва reset_score(id) в

Код за потвърждение: Избери целия код

public cshop_item_selected(id, iItem)
{
	if(iItem == ITEM_RESETSCORE)
		g_bHasItem[id] = true
}
Пробвах различни варианти, като махнах

Код за потвърждение: Избери целия код

g_bHasItem[id]
, като го замених с

Код за потвърждение: Избери целия код

reset_score(id)
, но ефект нулев. Дори и при

Код за потвърждение: Избери целия код

public client_putinserver(id)
	g_bHasItem[id] = false
да го заменя с

Код за потвърждение: Избери целия код

reset_score(id)
пробвах, но пак грешки.

Очевидно това g_bHasItem[id] е задължително, за да работи итемът.
Иван Маринов,

лицензиран оператор и пилот на професионални дронове клас C1 за всички държави в EU.

DJI Mavic 3 Classic | DJI Mavic 3 PRO - погледни света от различна перспектива.

Последвайте ме във Facebook

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

въпросче, за шоп магазин

Мнение от OciXCrom » 03 Мар 2018, 16:35

g_bHasItem е ненужно в целия плъгин, тъй като няма нужда да знаеш дали играчът е ползвал предмета, понеже няма нужда да го премахнеш по-късно.

Код за потвърждение: Избери целия код

public cshop_item_selected(id, iItem)
{
	if(iItem == ITEM_RESETSCORE)
		reset_score(id)
}

Аватар
Marinovv
Извън линия
Потребител
Потребител
Мнения: 511
Регистриран на: 19 Сеп 2017, 10:01
Местоположение: България
Се отблагодари: 530 пъти
Получена благодарност: 13 пъти
Обратна връзка:

въпросче, за шоп магазин

Мнение от Marinovv » 03 Мар 2018, 16:57

Стана. Занапред вече ще зная как да вкарвам итеми, но така и не разбирам как се махат команди. Пробвах примерно на прост ресет скор да махна /rs , но уви..

И с команди ще караме.

П.С. ето един оптимизиран рестарт скор:

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <customshop>

#define PLUGIN_VERSION "4.x"

additem ITEM_RESETSCORE


public plugin_init()
{
	register_plugin("Crom's ResetScore", PLUGIN_VERSION, "Author OciXCrom")
}

public plugin_precache()
	ITEM_RESETSCORE = cshop_register_item("resetscore", "Reset Score | Frags", 100)
	
public cshop_item_selected(id, iItem)
{
	if(iItem == ITEM_RESETSCORE)
	 score_remove(id)
}


public score_remove(id)
{
	cs_set_user_deaths(id, 0)
	set_user_frags(id, 0)
	cs_set_user_deaths(id, 0)
	set_user_frags(id, 0)
	
}
Като цяло не било толкова трудно това. Като изключим командите, но все пак съм с напредък.
:lock:
Иван Маринов,

лицензиран оператор и пилот на професионални дронове клас C1 за всички държави в EU.

DJI Mavic 3 Classic | DJI Mavic 3 PRO - погледни света от различна перспектива.

Последвайте ме във Facebook

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

въпросче, за шоп магазин

Мнение от OciXCrom » 03 Мар 2018, 19:51

За да ги махнеш, просто премахни register_clcmd редовете в plugin_init.

Заключено
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 17 госта