Заявка за редактиране на lasermine

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Заявка за редактиране на lasermine

Мнение от iv69 » 08 Апр 2020, 14:47

Ще може ли към настройките в началото на плъгина, да се добави и квар за парите, които се получават при убийство с лазера? Сега дава по дефолт /300$/, но това не ме устройва.

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

#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <xs>
#include <beams>
#include <fun>
 
#define PLUGIN "SF TripMine"
#define VERSION "0.3.4"
#define AUTHOR "serfreeman1337"
 
#if AMXX_VERSION_NUM < 183
        #define message_begin_f(%0,%1,%2,%3)    engfunc(EngFunc_MessageBegin,%0,%1,%2,%3)
        #define write_coord_f(%0)               engfunc(EngFunc_WriteCoord,%0)
       
        #define Ham_CS_Player_ResetMaxSpeed     Ham_Item_PreFrame
       
        #include <dhudmessage>
        #include <colorchat>
       
        #define print_team_default DontChange
        #define print_team_grey Grey
        #define print_team_red Red
        #define print_team_blue Blue
#endif

 
#define SND_STOP                (1<<5)
 
#define TRIPMINE_MODEL          "models/v_lasermine.mdl"                // tripmine model
#define TRIPMINE_CLASSNAME      "lasermine"             // tripmine classname
 
#define BEAM_SPRITERED          "sprites/laserr.spr"
#define BEAM_SPRITEBLUE         "sprites/laserb.spr"
 
#define TRIPMINE_PLANTSOUND     "csdm/laser_beta/mine_deploy.wav"       // plant sound
#define TRIPMINE_CHARGESOUND    "csdm/laser_beta/mine_charge.wav"       // charge sound
#define TRIPMINE_ACTIVESOUND    "csdm/laser_beta/mine_activate.wav"     // active sound
#define TRIPMINE_HITSOUND       "csdm/laser_beta/beamstart9.wav"        // hit sound
 
#define PLANTWAITTIME           0.1
#define POWERUPTIME             2.0
#define BEAM_WIDTH              15.0
#define BEAM_BRIGHT             255.0
// за разрушение мины
#define REWARD_MONEY 200
 
#define PLANT_TIME              1.0                             // tripmine plant time
#define MINE_HEALTH             500.0                           // tripmine health

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define MAX_COUNT               1                               // макс количество мин для обычного игрока
#define MAX_COUNT_V             2                               // макс количество мин для випа
#define MAX_COUNT_SV            3                               // макс количество мин для супер випа
#define MAX_COUNT_B             4                               // макс количество мин для босса
#define MAX_COUNT_A             4                               // макс количество мин для админа


#define FLAG_V					ADMIN_RESERVATION
#define FLAG_SV					ADMIN_LEVEL_H
#define FLAG_B					ADMIN_LEVEL_G
#define FLAG_A					ADMIN_BAN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define MINE_DAMAGE             1000.0                            // laser damage
#define MINE_COST               4000                             // tripmine cost
#define PLANT_RADIUS            64.0                            // default plant radius
#define LASER_LENGTH            8128.0                          // maximum laser length
 
#define EV_TM_hOwner            EV_ENT_euser4
#define EV_TM_pBeam             EV_ENT_euser3
#define EV_TM_team              EV_INT_iuser4
#define EV_TM_plantTime         EV_FL_fuser4
#define EV_TM_mVecDir           EV_VEC_vuser4
#define EV_TM_mVecEnd           EV_VEC_vuser3
 
#define EV_TM_mineId            EV_INT_iuser3
 
///
 
#define ENTITY_REFERENCE        "func_breakable"
 
// -- DATAS -- //
enum _:playerDataStruct {
        PD_MINE_ENT,
        Float:PD_NEXTPLANT_TIME,
        bool:PD_START_SET
}
 
new maxPlayers,expSpr
new playerData[33][playerDataStruct]
new HamHook:playerPostThink,thinkHooks
 
new BarTime
 
public plugin_precache(){
        precache_model(TRIPMINE_MODEL)
       
        precache_sound(TRIPMINE_PLANTSOUND)
        precache_sound(TRIPMINE_CHARGESOUND)
        precache_sound(TRIPMINE_ACTIVESOUND)
        precache_sound(TRIPMINE_HITSOUND)
       
        precache_model(BEAM_SPRITERED)
        precache_model(BEAM_SPRITEBLUE)
       
        expSpr = precache_model("sprites/csdm_explode.spr")
	precache_sound("dmsentries/fail_update_2.wav")
}
 
public plugin_init(){
        register_plugin(PLUGIN,VERSION,AUTHOR)
 
        BarTime = get_user_msgid("BarTime")
        maxPlayers = get_maxplayers()
       
        register_clcmd("say /laser","SetLaser_CMD") //установка
        register_clcmd("say /unlaser","SetLaser_DropCMD") // уничтожение
       
        register_think(TRIPMINE_CLASSNAME,"TripMine_Think")
        RegisterHam(Ham_TakeDamage,ENTITY_REFERENCE,"TripMine_Damage")
        RegisterHam(Ham_Killed,ENTITY_REFERENCE,"TripMine_Killed")
       
        register_logevent("RoundEnd",2,"1=Round_End")
        register_logevent("RoundEnd",2,"1=Round_Start")
       
	register_think("beam","Beam_Think")
}
//
// random beams fix attempt
//
public Beam_Think(ent){
        new mine = entity_get_edict(ent,EV_ENT_owner)
       
        if(!is_valid_ent(ent))
                UTIL_Remove(ent)
       
        if(entity_get_int(ent,EV_TM_mineId) != entity_get_int(mine,EV_TM_mineId))
                UTIL_Remove(ent)
       
        entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.05)
}
 
public RoundEnd(){
        new ent
       
        while((ent = find_ent_by_class(ent,TRIPMINE_CLASSNAME))){
                new beam = entity_get_edict(ent,EV_TM_pBeam)
               
                if(is_valid_ent(beam))
                        remove_entity(beam)
                       
                remove_entity(ent)
        }
}
 
public SetLaser_CMD(id){
		if(get_user_flags(id) & FLAG_A){
				if(GetPlayer_Mines(id) >= MAX_COUNT_A){ // Для админа
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
		
		else if(get_user_flags(id) & FLAG_B){ // Для босса
			if(GetPlayer_Mines(id) >= MAX_COUNT_B){
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
		
		else if(get_user_flags(id) & FLAG_SV){ // Для для супер випа
			if(GetPlayer_Mines(id) >= MAX_COUNT_SV){
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
		
		else if(get_user_flags(id) & FLAG_V){ // Для випа
			if(GetPlayer_Mines(id) >= MAX_COUNT_V){
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
	
		else if(GetPlayer_Mines(id) >= MAX_COUNT){ // Для обычного игрока
			playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
			ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed  ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT)
			emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			return PLUGIN_HANDLED
        }

		playerData[id][PD_START_SET] = true
       
		thinkHooks++
       
		if(thinkHooks == 1){
			if(!playerPostThink)
						#if AMXX_VERSION_NUM >= 183
                        playerPostThink = RegisterHamPlayer(Ham_Player_PostThink,"Player_PostThink",true)
                        #else
                        playerPostThink = RegisterHam(Ham_Player_PostThink,"player","Player_PostThink",true)
                        #endif
			else
                        EnableHamForward(playerPostThink)
        }
       
        return PLUGIN_HANDLED
}
 
public SetLaser_DropCMD(id){
        if(!playerData[id][PD_START_SET])
                return PLUGIN_HANDLED
               
        thinkHooks--
       
        if(thinkHooks <= 0)
                DisableHamForward(playerPostThink)
               
        playerData[id][PD_START_SET] = false
       
        if(is_valid_ent(playerData[id][PD_MINE_ENT])){
                remove_entity(playerData[id][PD_MINE_ENT])
                Send_BarTime(id,0.0)
                playerData[id][PD_MINE_ENT] = FM_NULLENT
                playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
        }
               
        return PLUGIN_HANDLED
}
 
public Player_PostThink(id){
        if(playerData[id][PD_START_SET])
                if(TripMine_PlantThink(id))
                        TripMine_Plant(id,playerData[id][PD_MINE_ENT]) // plant mine
}
 
//
// Spawn tripmine entity
//
TripMine_Spawn(){
        new tm = create_entity(ENTITY_REFERENCE)
       
        entity_set_string(tm,EV_SZ_classname,TRIPMINE_CLASSNAME)
       
        // motor
        entity_set_int(tm,EV_INT_movetype,MOVETYPE_FLY)
        entity_set_int(tm,EV_INT_solid,SOLID_NOT)
       
        entity_set_model(tm,TRIPMINE_MODEL)
        entity_set_float(tm,EV_FL_frame,0.0)
        entity_set_int(tm,EV_INT_body,3)
        entity_set_int(tm,EV_INT_sequence,7)    // TRIPMINE_WORLD
        entity_set_float(tm,EV_FL_framerate,0.0)
       
        entity_set_size(tm,Float:{-8.0,-8.0,-8.0},Float:{8.0,8.0,8.0})
       
        return tm
}
 
GetPlayer_Mines(id){
        new ent,cnt
       
        while((ent = find_ent_by_class(ent,TRIPMINE_CLASSNAME))){
                if(id == entity_get_edict(ent,EV_TM_hOwner))
                        cnt ++
        }
       
        return cnt
}
 
//
// Visual planting for tripmine
//      id - planter id
//      reset - stop planting
//
TripMine_PlantThink(id,bool:reset = false){
        if(playerData[id][PD_NEXTPLANT_TIME] > get_gametime())
                return false
               
        new ent = playerData[id][PD_MINE_ENT]
       
        if(!is_user_alive(id) ||
                cs_get_user_money(id) - MINE_COST < 0
        ){ // don't allow planting while running or dead
			if(is_valid_ent(ent)){
					remove_entity(ent)
					Send_BarTime(id,0.0)
			}
			ColorChat(id,GREEN,"^3[^4LASER^3]^1 You have ^3not enough ^1money! ^4(^1Needed ^3%d$^4)",MINE_COST)
			emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			playerData[id][PD_MINE_ENT] = FM_NULLENT
			SetLaser_DropCMD(id)
			//playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
   
			return false
        }
       
        if(reset){ // destroy visal object
                if(is_valid_ent(ent)){
                        remove_entity(ent)
                        Send_BarTime(id,0.0)
                        playerData[id][PD_MINE_ENT] = FM_NULLENT
                       
                        return true
                }
               
                return false
        }
       
        // make trace origin
        new Float:vecSrc[3],Float:vecAiming[3]
        entity_get_vector(id,EV_VEC_v_angle,vecSrc)
        engfunc(EngFunc_MakeVectors,vecSrc)
       
        entity_get_vector(id,EV_VEC_origin,vecSrc)
        entity_get_vector(id,EV_VEC_view_ofs,vecAiming)
       
        xs_vec_add(vecSrc,vecAiming,vecSrc)
        get_global_vector(GL_v_forward,vecAiming)
       
        xs_vec_mul_scalar(vecAiming,PLANT_RADIUS,vecAiming)
        xs_vec_add(vecSrc,vecAiming,vecAiming)
       
        new Float:flFraction
        engfunc(EngFunc_TraceLine,vecSrc,vecAiming,IGNORE_MISSILE|IGNORE_GLASS|IGNORE_MONSTERS,id,0)
       
        get_tr2(0,TR_flFraction,flFraction)
       
        if(flFraction < 1.0){ // valid trace
                new pHit
               
                new Float:vecEnd[3],bool:noUpdate
                get_tr2(0,TR_vecEndPos,vecEnd)
               
                while((pHit = find_ent_in_sphere(pHit,vecEnd,8.0))){ // don't allow plant mine close together with others
                        if(pHit <= maxPlayers || pHit == ent)
                                continue
                               
                        new classname[32]
                        entity_get_string(pHit,EV_SZ_classname,classname,charsmax(classname))  
                       
                        if(strcmp(classname,TRIPMINE_CLASSNAME) == 0){
                                noUpdate = true
                               
                                if(!is_valid_ent(ent))
                                        return false
                        }
                }
               
                if(!is_valid_ent(ent)){ // create visal object
                        ent =TripMine_Spawn()
               
                        // set transparency
                        entity_set_int(ent,EV_INT_rendermode,kRenderTransAdd)
                        entity_set_float(ent,EV_FL_renderamt,255.0)
                       
                        new Float:plantTime = PLANT_TIME
                       
                        // set plant time
                        entity_set_float(ent,EV_TM_plantTime,get_gametime() + plantTime)
                        entity_set_float(id,EV_FL_maxspeed,1.0)
                       
                        // show plant progress
                        Send_BarTime(id,plantTime)
                       
                        playerData[id][PD_MINE_ENT] = ent
                }
               
                if(!noUpdate){
                        new Float:vecPlaneNormal[3],Float:angles[3]
                        get_tr2(0,TR_vecPlaneNormal,vecPlaneNormal)
                        vector_to_angle(vecPlaneNormal,angles)
                       
                        // calc ideal end pos
                        xs_vec_mul_scalar(vecPlaneNormal,8.0,vecPlaneNormal)
                        xs_vec_add(vecEnd,vecPlaneNormal,vecEnd)
                       
                        // set origin and angles
                        entity_set_origin(ent,vecEnd)
                        entity_set_vector(ent,EV_VEC_angles,angles)
                }
               
                if(entity_get_float(ent,EV_TM_plantTime) < get_gametime()){
                        new Float:m_vecDir[3],Float:angles[3]
                       
                        entity_get_vector(ent,EV_VEC_angles,angles)
                        engfunc(EngFunc_MakeVectors,angles)
                        get_global_vector(GL_v_forward,m_vecDir)
                       
                        m_vecDir[2] = -m_vecDir[2] // только в России верх - это низ, а низ - это верх
 
                        entity_set_vector(ent,EV_TM_mVecDir,m_vecDir)
                       
                        return true
                }
        }else{ // wrong origin
                if(is_valid_ent(ent)){
                        remove_entity(ent)
                        Send_BarTime(id,0.0)
                        playerData[id][PD_MINE_ENT] = FM_NULLENT
                }
        }
               
        return false
}
 
//
// Plant mine
//
TripMine_Plant(id,ent){
        playerData[id][PD_MINE_ENT] = FM_NULLENT
        playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
       
        entity_set_int(ent,EV_INT_rendermode,kRenderNormal)
        entity_set_float(ent,EV_FL_renderamt,0.0)
       
        entity_set_edict(ent,EV_TM_hOwner,id)
        entity_set_int(ent,EV_TM_team,get_user_team(id))
       
        emit_sound(ent,CHAN_VOICE,TRIPMINE_PLANTSOUND,1.0,ATTN_NORM,0,PITCH_NORM)
        emit_sound(ent,CHAN_BODY,TRIPMINE_CHARGESOUND,0.2,ATTN_NORM,0,PITCH_NORM)
       
        entity_set_float(ent,EV_TM_plantTime,get_gametime() + POWERUPTIME)
        entity_set_float(ent,EV_FL_nextthink,get_gametime() + POWERUPTIME)
       
        ExecuteHamB(Ham_CS_Player_ResetMaxSpeed,id)
       
        cs_set_user_money(id,cs_get_user_money(id) - MINE_COST)
       
        //if(GetPlayer_Mines(id) >= MAX_COUNT) // stop
        SetLaser_DropCMD(id)
       
        return true
}
 
//
// Tripmine think
//
public TripMine_Think(ent){
        if(entity_get_float(ent,EV_TM_plantTime)){ // check the possibility to activate
                new Float:m_vecDir[3]
                entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
       
                new Float:vecSrc[3],Float:vecEnd[3]
               
                entity_get_vector(ent,EV_VEC_origin,vecSrc)
                xs_vec_copy(vecSrc,vecEnd)
       
                xs_vec_mul_scalar(m_vecDir,8.0,m_vecDir)
                xs_vec_add(vecSrc,m_vecDir,vecSrc)
               
                entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
                xs_vec_mul_scalar(m_vecDir,32.0,m_vecDir)
                xs_vec_add(vecEnd,m_vecDir,vecEnd)
               
                engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,0)
               
                new Float:flFraction
               
                get_tr2(0,TR_flFraction,flFraction)
               
                if(flFraction == 1.0){
                        get_tr2(0,TR_vecEndPos,vecEnd)
                       
                        new f
                        // make sure that player will not stuck on mine
                        while((f = find_ent_in_sphere(f,vecSrc,12.0))){
                                if(f > maxPlayers)
                                        break
                                       
                                entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.1)
                                return
                        }
                       
                        emit_sound(ent,CHAN_BODY,TRIPMINE_CHARGESOUND,0.0,ATTN_NORM,SND_STOP,0)
                        emit_sound(ent,CHAN_VOICE,TRIPMINE_ACTIVESOUND,0.5,ATTN_NORM,1,75)
                       
                        entity_set_int(ent,EV_TM_mineId,random(1337))
                        TripMine_MakeBeam(ent)
                       
                        entity_set_int(ent,EV_INT_solid,SOLID_BBOX)
                        entity_set_float(ent,EV_TM_plantTime,0.0)
                       
                        entity_set_float(ent,EV_FL_takedamage,DAMAGE_YES)
                        entity_set_float(ent,EV_FL_dmg,100.0)
                        entity_set_float(ent,EV_FL_health,MINE_HEALTH)
                }
        }
       
        new beam = entity_get_edict(ent,EV_TM_pBeam)
       
        if(entity_get_float(ent,EV_FL_health) <= 0.0 && is_valid_ent(beam)){
                ExecuteHamB(Ham_Killed,ent,0,0)
                return
        }
       
        new id = entity_get_edict(ent,EV_TM_hOwner)
       
        if(!is_user_alive(id) || get_user_team(id) != entity_get_int(ent,EV_TM_team)){ // explode mine on disconnect or team change
                new beam = entity_get_edict(ent,EV_TM_pBeam)
                if(is_valid_ent(beam))
                        UTIL_Remove(beam)
               
                remove_entity(ent)
               
                //ExecuteHamB(Ham_TakeDamage,ent,0,0,9999.0,DMG_BLAST)
                return
        }
       
        if(is_valid_ent(beam)){
                new Float:vecSrc[3],Float:vecEnd[3]
               
                entity_get_vector(ent,EV_VEC_origin,vecSrc)
                entity_get_vector(ent,EV_TM_mVecEnd,vecEnd)
               
                new pHit,tr = create_tr2()
                engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,tr)
               
                pHit = get_tr2(tr,TR_pHit)
                get_tr2(tr,TR_vecEndPos,vecEnd)
               
                Beam_SetStartPos(beam,vecEnd)
               
                message_begin_f(MSG_PVS,SVC_TEMPENTITY,vecEnd,0)
                write_byte(TE_SPARKS)
                write_coord_f(vecEnd[0])
                write_coord_f(vecEnd[1])
                write_coord_f(vecEnd[2])
                message_end()
               
                if(0 < pHit <= maxPlayers){
                        new team = entity_get_int(ent,EV_TM_team)
                       
                        if(get_user_team(pHit) != team && entity_get_float(pHit,EV_FL_takedamage) != 0.0){
                                if(ExecuteHamB(Ham_TakeDamage,pHit,ent,entity_get_edict(ent,EV_TM_hOwner),MINE_DAMAGE,16777216)){
                                        ExecuteHamB(Ham_TraceBleed,pHit,1337.0,Float:{0.0,0.0,0.0},tr,DMG_ENERGYBEAM)
                                        //client_print(0,print_chat,"Атака")
                                }else{
                                        //client_print(0,print_chat,"Убил")
                                        emit_sound(pHit,CHAN_WEAPON,TRIPMINE_HITSOUND, 1.0, ATTN_NORM, 0, PITCH_NORM )
                                        entity_set_vector(pHit,EV_VEC_velocity,Float:{0.0,0.0,0.0})
                                }
                        }
                }
                free_tr2(tr)
        }
       
        if(is_valid_ent(ent)){
                TripMine_StatusInfo(ent)
                entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.1)
        }
}
 
TripMine_StatusInfo(ent){
        if(!is_valid_ent(ent))
                return
       
        new player,Float:origin[3],hitEnt,bh
        entity_get_vector(ent,EV_VEC_origin,origin)
       
        while((player = find_ent_in_sphere(player,origin,1024.0))){
                if(player > maxPlayers)
                        break
                       
                if(get_user_team(player) != entity_get_int(ent,EV_TM_team))
                        continue
                       
                get_user_aiming(player,hitEnt,bh)
               
                if(hitEnt != ent)
                        continue
               
                new planterId,planterName[32],team = entity_get_int(ent,EV_TM_team)
               
                planterId = entity_get_edict(ent,EV_TM_hOwner)
                get_user_name(planterId,planterName,charsmax(planterName))
               
                set_dhudmessage(team == 1 ? 150 : 0, 0, team == 2 ? 150 : 0, -1.0, 0.35, 0, 0.0, 0.6, 0.0, 0.0)
                show_dhudmessage(player,"Installed: %s^nHealth: %.0f",planterName,entity_get_float(ent,EV_FL_health))
        }
}
 
//
// Tripmine damage
//
public TripMine_Damage(ent,inflictor,attacker){
        new classname[32]
        entity_get_string(ent,EV_SZ_classname,classname,charsmax(classname))
       
        if(strcmp(classname,TRIPMINE_CLASSNAME) != 0)
                return HAM_IGNORED
               
        entity_set_edict(ent,EV_ENT_dmg_inflictor,attacker)
       
        if(!(0 < attacker <= maxPlayers))
                return HAM_IGNORED
       
        if(entity_get_int(ent,EV_TM_team) == get_user_team(attacker) && entity_get_edict(ent,EV_TM_hOwner) != attacker) // block friendly fire
                return HAM_SUPERCEDE
               
        return HAM_IGNORED
}
 
//
// Tripmine detonate
//
public TripMine_Killed(ent,idattacker){
        new classname[32]
        entity_get_string(ent,EV_SZ_classname,classname,charsmax(classname))
       
        if(strcmp(classname,TRIPMINE_CLASSNAME) != 0)
                return HAM_IGNORED
               
        new beam = entity_get_edict(ent,EV_TM_pBeam)
       
        // remove beam
        if(is_valid_ent(beam))
                UTIL_Remove(beam)
               
        new Float:origin[3],Float:m_vecDir[3]
        entity_get_vector(ent,EV_VEC_origin,origin)
        entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
        //client_print(0,print_chat,"Kill")
        xs_vec_mul_scalar(m_vecDir,8.0,m_vecDir)
        xs_vec_add(origin,m_vecDir,origin)
       
        message_begin_f(MSG_PVS,SVC_TEMPENTITY,origin,0)
        write_byte(TE_EXPLOSION)
        write_coord_f(origin[0])
        write_coord_f(origin[1])
        write_coord_f(origin[2])
        write_short(expSpr)
        write_byte(20)
        write_byte(15)
        write_byte(0)
        message_end()
       
        new killer = entity_get_edict(ent,EV_ENT_dmg_inflictor)
        new hOwner = entity_get_edict(ent,EV_TM_hOwner)

       
        if(!(0 < killer <= maxPlayers) || killer == entity_get_edict(ent,EV_TM_hOwner))
                ColorChat(hOwner,GREEN,"^3[^4LASER^3]^1 your mine was ^4destroyed!!")
        else{
				new exploderName[32]
				get_user_name(killer,exploderName,charsmax(exploderName))
               
				ColorChat(hOwner,GREEN,"^3[^4LASER^3]^4 %s destroyed ^1your mine!",exploderName)

				ColorChat(killer,GREEN,"^3[^4LASER^3]^1 You received ^4%d$ ^1for the destruction of mines!", REWARD_MONEY)
				cs_set_user_money ( killer, min ( cs_get_user_money ( killer ) + REWARD_MONEY, 16000 ) )
        }
       
        return HAM_IGNORED
}
 
//
// Create beam for tripmine
//
TripMine_MakeBeam(ent){
        new beam = Beam_Create(entity_get_int(ent,EV_TM_team) == 1 ? BEAM_SPRITERED : BEAM_SPRITEBLUE,BEAM_WIDTH)
       
        new Float:m_vecDir[3],Float:vecSrc[3],Float:vecOrigin[3]
        entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
        entity_get_vector(ent,EV_VEC_origin,vecSrc)
        xs_vec_copy(vecSrc,vecOrigin)
        xs_vec_mul_scalar(m_vecDir,LASER_LENGTH,m_vecDir)
        xs_vec_add(vecSrc,m_vecDir,vecSrc)
       
        Beam_PointsInit(beam,vecSrc,vecOrigin)
        Beam_SetScrollRate(beam,255.0)
        Beam_SetBrightness(beam,BEAM_BRIGHT)
       
        entity_set_edict(ent,EV_TM_pBeam,beam)
        entity_set_vector(ent,EV_TM_mVecEnd,vecSrc)
        entity_set_edict(beam,EV_ENT_owner,ent)
       
        entity_set_int(beam,EV_TM_mineId,entity_get_int(ent,EV_TM_mineId))
       
        entity_set_float(beam,EV_FL_nextthink,get_gametime() + 0.1)
}
 
Send_BarTime(player,Float:duration){
        if(duration == 0.0){
                ExecuteHamB(Ham_CS_Player_ResetMaxSpeed,player)
        }
       
        message_begin(MSG_ONE,BarTime,.player = player)
        write_short(floatround(duration))
        message_end()
}
 
 
UTIL_Remove( pEntity )
{
        if ( !pEntity )
                return;
               
        entity_set_int(pEntity,EV_INT_flags,entity_get_int(pEntity,EV_INT_flags) | FL_KILLME)
        //entity_set_string(pEntity,EV_SZ_targetname,"")
}
Благодаря.

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

Заявка за редактиране на lasermine

Мнение от OciXCrom » 08 Апр 2020, 15:28

#define REWARD_KILL 200

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

#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <xs>
#include <beams>
#include <fun>
 
#define PLUGIN "SF TripMine"
#define VERSION "0.3.4"
#define AUTHOR "serfreeman1337"
 
#if AMXX_VERSION_NUM < 183
        #define message_begin_f(%0,%1,%2,%3)    engfunc(EngFunc_MessageBegin,%0,%1,%2,%3)
        #define write_coord_f(%0)               engfunc(EngFunc_WriteCoord,%0)
       
        #define Ham_CS_Player_ResetMaxSpeed     Ham_Item_PreFrame
       
        #include <dhudmessage>
        #include <colorchat>
       
        #define print_team_default DontChange
        #define print_team_grey Grey
        #define print_team_red Red
        #define print_team_blue Blue
#endif

 
#define SND_STOP                (1<<5)
 
#define TRIPMINE_MODEL          "models/v_lasermine.mdl"                // tripmine model
#define TRIPMINE_CLASSNAME      "lasermine"             // tripmine classname
 
#define BEAM_SPRITERED          "sprites/laserr.spr"
#define BEAM_SPRITEBLUE         "sprites/laserb.spr"
 
#define TRIPMINE_PLANTSOUND     "csdm/laser_beta/mine_deploy.wav"       // plant sound
#define TRIPMINE_CHARGESOUND    "csdm/laser_beta/mine_charge.wav"       // charge sound
#define TRIPMINE_ACTIVESOUND    "csdm/laser_beta/mine_activate.wav"     // active sound
#define TRIPMINE_HITSOUND       "csdm/laser_beta/beamstart9.wav"        // hit sound
 
#define PLANTWAITTIME           0.1
#define POWERUPTIME             2.0
#define BEAM_WIDTH              15.0
#define BEAM_BRIGHT             255.0
// за разрушение мины
#define REWARD_MONEY 200
// for kill with mine
#define REWARD_KILL 200
 
#define PLANT_TIME              1.0                             // tripmine plant time
#define MINE_HEALTH             500.0                           // tripmine health

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define MAX_COUNT               1                               // макс количество мин для обычного игрока
#define MAX_COUNT_V             2                               // макс количество мин для випа
#define MAX_COUNT_SV            3                               // макс количество мин для супер випа
#define MAX_COUNT_B             4                               // макс количество мин для босса
#define MAX_COUNT_A             4                               // макс количество мин для админа


#define FLAG_V					ADMIN_RESERVATION
#define FLAG_SV					ADMIN_LEVEL_H
#define FLAG_B					ADMIN_LEVEL_G
#define FLAG_A					ADMIN_BAN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define MINE_DAMAGE             1000.0                            // laser damage
#define MINE_COST               4000                             // tripmine cost
#define PLANT_RADIUS            64.0                            // default plant radius
#define LASER_LENGTH            8128.0                          // maximum laser length
 
#define EV_TM_hOwner            EV_ENT_euser4
#define EV_TM_pBeam             EV_ENT_euser3
#define EV_TM_team              EV_INT_iuser4
#define EV_TM_plantTime         EV_FL_fuser4
#define EV_TM_mVecDir           EV_VEC_vuser4
#define EV_TM_mVecEnd           EV_VEC_vuser3
 
#define EV_TM_mineId            EV_INT_iuser3
 
///
 
#define ENTITY_REFERENCE        "func_breakable"
 
// -- DATAS -- //
enum _:playerDataStruct {
        PD_MINE_ENT,
        Float:PD_NEXTPLANT_TIME,
        bool:PD_START_SET
}
 
new maxPlayers,expSpr
new playerData[33][playerDataStruct]
new HamHook:playerPostThink,thinkHooks
 
new BarTime
 
public plugin_precache(){
        precache_model(TRIPMINE_MODEL)
       
        precache_sound(TRIPMINE_PLANTSOUND)
        precache_sound(TRIPMINE_CHARGESOUND)
        precache_sound(TRIPMINE_ACTIVESOUND)
        precache_sound(TRIPMINE_HITSOUND)
       
        precache_model(BEAM_SPRITERED)
        precache_model(BEAM_SPRITEBLUE)
       
        expSpr = precache_model("sprites/csdm_explode.spr")
	precache_sound("dmsentries/fail_update_2.wav")
}
 
public plugin_init(){
        register_plugin(PLUGIN,VERSION,AUTHOR)
 
        BarTime = get_user_msgid("BarTime")
        maxPlayers = get_maxplayers()
       
        register_clcmd("say /laser","SetLaser_CMD") //установка
        register_clcmd("say /unlaser","SetLaser_DropCMD") // уничтожение
       
        register_think(TRIPMINE_CLASSNAME,"TripMine_Think")
        RegisterHam(Ham_TakeDamage,ENTITY_REFERENCE,"TripMine_Damage")
        RegisterHam(Ham_Killed,ENTITY_REFERENCE,"TripMine_Killed")
       
        register_logevent("RoundEnd",2,"1=Round_End")
        register_logevent("RoundEnd",2,"1=Round_Start")
       
	register_think("beam","Beam_Think")
}
//
// random beams fix attempt
//
public Beam_Think(ent){
        new mine = entity_get_edict(ent,EV_ENT_owner)
       
        if(!is_valid_ent(ent))
                UTIL_Remove(ent)
       
        if(entity_get_int(ent,EV_TM_mineId) != entity_get_int(mine,EV_TM_mineId))
                UTIL_Remove(ent)
       
        entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.05)
}
 
public RoundEnd(){
        new ent
       
        while((ent = find_ent_by_class(ent,TRIPMINE_CLASSNAME))){
                new beam = entity_get_edict(ent,EV_TM_pBeam)
               
                if(is_valid_ent(beam))
                        remove_entity(beam)
                       
                remove_entity(ent)
        }
}
 
public SetLaser_CMD(id){
		if(get_user_flags(id) & FLAG_A){
				if(GetPlayer_Mines(id) >= MAX_COUNT_A){ // Для админа
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
		
		else if(get_user_flags(id) & FLAG_B){ // Для босса
			if(GetPlayer_Mines(id) >= MAX_COUNT_B){
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
		
		else if(get_user_flags(id) & FLAG_SV){ // Для для супер випа
			if(GetPlayer_Mines(id) >= MAX_COUNT_SV){
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
		
		else if(get_user_flags(id) & FLAG_V){ // Для випа
			if(GetPlayer_Mines(id) >= MAX_COUNT_V){
					playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
					ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT_A)
					emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
					return PLUGIN_HANDLED
				}
        }
	
		else if(GetPlayer_Mines(id) >= MAX_COUNT){ // Для обычного игрока
			playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
			ColorChat(id,GREEN,"^3[^4LASER^3] ^1Installed  ^3maximum amount ^1lasers! You can use it %d lasers", MAX_COUNT)
			emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			return PLUGIN_HANDLED
        }

		playerData[id][PD_START_SET] = true
       
		thinkHooks++
       
		if(thinkHooks == 1){
			if(!playerPostThink)
						#if AMXX_VERSION_NUM >= 183
                        playerPostThink = RegisterHamPlayer(Ham_Player_PostThink,"Player_PostThink",true)
                        #else
                        playerPostThink = RegisterHam(Ham_Player_PostThink,"player","Player_PostThink",true)
                        #endif
			else
                        EnableHamForward(playerPostThink)
        }
       
        return PLUGIN_HANDLED
}
 
public SetLaser_DropCMD(id){
        if(!playerData[id][PD_START_SET])
                return PLUGIN_HANDLED
               
        thinkHooks--
       
        if(thinkHooks <= 0)
                DisableHamForward(playerPostThink)
               
        playerData[id][PD_START_SET] = false
       
        if(is_valid_ent(playerData[id][PD_MINE_ENT])){
                remove_entity(playerData[id][PD_MINE_ENT])
                Send_BarTime(id,0.0)
                playerData[id][PD_MINE_ENT] = FM_NULLENT
                playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
        }
               
        return PLUGIN_HANDLED
}
 
public Player_PostThink(id){
        if(playerData[id][PD_START_SET])
                if(TripMine_PlantThink(id))
                        TripMine_Plant(id,playerData[id][PD_MINE_ENT]) // plant mine
}
 
//
// Spawn tripmine entity
//
TripMine_Spawn(){
        new tm = create_entity(ENTITY_REFERENCE)
       
        entity_set_string(tm,EV_SZ_classname,TRIPMINE_CLASSNAME)
       
        // motor
        entity_set_int(tm,EV_INT_movetype,MOVETYPE_FLY)
        entity_set_int(tm,EV_INT_solid,SOLID_NOT)
       
        entity_set_model(tm,TRIPMINE_MODEL)
        entity_set_float(tm,EV_FL_frame,0.0)
        entity_set_int(tm,EV_INT_body,3)
        entity_set_int(tm,EV_INT_sequence,7)    // TRIPMINE_WORLD
        entity_set_float(tm,EV_FL_framerate,0.0)
       
        entity_set_size(tm,Float:{-8.0,-8.0,-8.0},Float:{8.0,8.0,8.0})
       
        return tm
}
 
GetPlayer_Mines(id){
        new ent,cnt
       
        while((ent = find_ent_by_class(ent,TRIPMINE_CLASSNAME))){
                if(id == entity_get_edict(ent,EV_TM_hOwner))
                        cnt ++
        }
       
        return cnt
}
 
//
// Visual planting for tripmine
//      id - planter id
//      reset - stop planting
//
TripMine_PlantThink(id,bool:reset = false){
        if(playerData[id][PD_NEXTPLANT_TIME] > get_gametime())
                return false
               
        new ent = playerData[id][PD_MINE_ENT]
       
        if(!is_user_alive(id) ||
                cs_get_user_money(id) - MINE_COST < 0
        ){ // don't allow planting while running or dead
			if(is_valid_ent(ent)){
					remove_entity(ent)
					Send_BarTime(id,0.0)
			}
			ColorChat(id,GREEN,"^3[^4LASER^3]^1 You have ^3not enough ^1money! ^4(^1Needed ^3%d$^4)",MINE_COST)
			emit_sound(id, CHAN_AUTO, "dmsentries/fail_update_2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			playerData[id][PD_MINE_ENT] = FM_NULLENT
			SetLaser_DropCMD(id)
			//playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
   
			return false
        }
       
        if(reset){ // destroy visal object
                if(is_valid_ent(ent)){
                        remove_entity(ent)
                        Send_BarTime(id,0.0)
                        playerData[id][PD_MINE_ENT] = FM_NULLENT
                       
                        return true
                }
               
                return false
        }
       
        // make trace origin
        new Float:vecSrc[3],Float:vecAiming[3]
        entity_get_vector(id,EV_VEC_v_angle,vecSrc)
        engfunc(EngFunc_MakeVectors,vecSrc)
       
        entity_get_vector(id,EV_VEC_origin,vecSrc)
        entity_get_vector(id,EV_VEC_view_ofs,vecAiming)
       
        xs_vec_add(vecSrc,vecAiming,vecSrc)
        get_global_vector(GL_v_forward,vecAiming)
       
        xs_vec_mul_scalar(vecAiming,PLANT_RADIUS,vecAiming)
        xs_vec_add(vecSrc,vecAiming,vecAiming)
       
        new Float:flFraction
        engfunc(EngFunc_TraceLine,vecSrc,vecAiming,IGNORE_MISSILE|IGNORE_GLASS|IGNORE_MONSTERS,id,0)
       
        get_tr2(0,TR_flFraction,flFraction)
       
        if(flFraction < 1.0){ // valid trace
                new pHit
               
                new Float:vecEnd[3],bool:noUpdate
                get_tr2(0,TR_vecEndPos,vecEnd)
               
                while((pHit = find_ent_in_sphere(pHit,vecEnd,8.0))){ // don't allow plant mine close together with others
                        if(pHit <= maxPlayers || pHit == ent)
                                continue
                               
                        new classname[32]
                        entity_get_string(pHit,EV_SZ_classname,classname,charsmax(classname))  
                       
                        if(strcmp(classname,TRIPMINE_CLASSNAME) == 0){
                                noUpdate = true
                               
                                if(!is_valid_ent(ent))
                                        return false
                        }
                }
               
                if(!is_valid_ent(ent)){ // create visal object
                        ent =TripMine_Spawn()
               
                        // set transparency
                        entity_set_int(ent,EV_INT_rendermode,kRenderTransAdd)
                        entity_set_float(ent,EV_FL_renderamt,255.0)
                       
                        new Float:plantTime = PLANT_TIME
                       
                        // set plant time
                        entity_set_float(ent,EV_TM_plantTime,get_gametime() + plantTime)
                        entity_set_float(id,EV_FL_maxspeed,1.0)
                       
                        // show plant progress
                        Send_BarTime(id,plantTime)
                       
                        playerData[id][PD_MINE_ENT] = ent
                }
               
                if(!noUpdate){
                        new Float:vecPlaneNormal[3],Float:angles[3]
                        get_tr2(0,TR_vecPlaneNormal,vecPlaneNormal)
                        vector_to_angle(vecPlaneNormal,angles)
                       
                        // calc ideal end pos
                        xs_vec_mul_scalar(vecPlaneNormal,8.0,vecPlaneNormal)
                        xs_vec_add(vecEnd,vecPlaneNormal,vecEnd)
                       
                        // set origin and angles
                        entity_set_origin(ent,vecEnd)
                        entity_set_vector(ent,EV_VEC_angles,angles)
                }
               
                if(entity_get_float(ent,EV_TM_plantTime) < get_gametime()){
                        new Float:m_vecDir[3],Float:angles[3]
                       
                        entity_get_vector(ent,EV_VEC_angles,angles)
                        engfunc(EngFunc_MakeVectors,angles)
                        get_global_vector(GL_v_forward,m_vecDir)
                       
                        m_vecDir[2] = -m_vecDir[2] // только в России верх - это низ, а низ - это верх
 
                        entity_set_vector(ent,EV_TM_mVecDir,m_vecDir)
                       
                        return true
                }
        }else{ // wrong origin
                if(is_valid_ent(ent)){
                        remove_entity(ent)
                        Send_BarTime(id,0.0)
                        playerData[id][PD_MINE_ENT] = FM_NULLENT
                }
        }
               
        return false
}
 
//
// Plant mine
//
TripMine_Plant(id,ent){
        playerData[id][PD_MINE_ENT] = FM_NULLENT
        playerData[id][PD_NEXTPLANT_TIME] =  _:(get_gametime() + PLANTWAITTIME)
       
        entity_set_int(ent,EV_INT_rendermode,kRenderNormal)
        entity_set_float(ent,EV_FL_renderamt,0.0)
       
        entity_set_edict(ent,EV_TM_hOwner,id)
        entity_set_int(ent,EV_TM_team,get_user_team(id))
       
        emit_sound(ent,CHAN_VOICE,TRIPMINE_PLANTSOUND,1.0,ATTN_NORM,0,PITCH_NORM)
        emit_sound(ent,CHAN_BODY,TRIPMINE_CHARGESOUND,0.2,ATTN_NORM,0,PITCH_NORM)
       
        entity_set_float(ent,EV_TM_plantTime,get_gametime() + POWERUPTIME)
        entity_set_float(ent,EV_FL_nextthink,get_gametime() + POWERUPTIME)
       
        ExecuteHamB(Ham_CS_Player_ResetMaxSpeed,id)
       
        cs_set_user_money(id,cs_get_user_money(id) - MINE_COST)
       
        //if(GetPlayer_Mines(id) >= MAX_COUNT) // stop
        SetLaser_DropCMD(id)
       
        return true
}
 
//
// Tripmine think
//
public TripMine_Think(ent){
        if(entity_get_float(ent,EV_TM_plantTime)){ // check the possibility to activate
                new Float:m_vecDir[3]
                entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
       
                new Float:vecSrc[3],Float:vecEnd[3]
               
                entity_get_vector(ent,EV_VEC_origin,vecSrc)
                xs_vec_copy(vecSrc,vecEnd)
       
                xs_vec_mul_scalar(m_vecDir,8.0,m_vecDir)
                xs_vec_add(vecSrc,m_vecDir,vecSrc)
               
                entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
                xs_vec_mul_scalar(m_vecDir,32.0,m_vecDir)
                xs_vec_add(vecEnd,m_vecDir,vecEnd)
               
                engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,0)
               
                new Float:flFraction
               
                get_tr2(0,TR_flFraction,flFraction)
               
                if(flFraction == 1.0){
                        get_tr2(0,TR_vecEndPos,vecEnd)
                       
                        new f
                        // make sure that player will not stuck on mine
                        while((f = find_ent_in_sphere(f,vecSrc,12.0))){
                                if(f > maxPlayers)
                                        break
                                       
                                entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.1)
                                return
                        }
                       
                        emit_sound(ent,CHAN_BODY,TRIPMINE_CHARGESOUND,0.0,ATTN_NORM,SND_STOP,0)
                        emit_sound(ent,CHAN_VOICE,TRIPMINE_ACTIVESOUND,0.5,ATTN_NORM,1,75)
                       
                        entity_set_int(ent,EV_TM_mineId,random(1337))
                        TripMine_MakeBeam(ent)
                       
                        entity_set_int(ent,EV_INT_solid,SOLID_BBOX)
                        entity_set_float(ent,EV_TM_plantTime,0.0)
                       
                        entity_set_float(ent,EV_FL_takedamage,DAMAGE_YES)
                        entity_set_float(ent,EV_FL_dmg,100.0)
                        entity_set_float(ent,EV_FL_health,MINE_HEALTH)
                }
        }
       
        new beam = entity_get_edict(ent,EV_TM_pBeam)
       
        if(entity_get_float(ent,EV_FL_health) <= 0.0 && is_valid_ent(beam)){
                ExecuteHamB(Ham_Killed,ent,0,0)
                return
        }
       
        new id = entity_get_edict(ent,EV_TM_hOwner)
       
        if(!is_user_alive(id) || get_user_team(id) != entity_get_int(ent,EV_TM_team)){ // explode mine on disconnect or team change
                new beam = entity_get_edict(ent,EV_TM_pBeam)
                if(is_valid_ent(beam))
                        UTIL_Remove(beam)
               
                remove_entity(ent)
               
                //ExecuteHamB(Ham_TakeDamage,ent,0,0,9999.0,DMG_BLAST)
                return
        }
       
        if(is_valid_ent(beam)){
                new Float:vecSrc[3],Float:vecEnd[3]
               
                entity_get_vector(ent,EV_VEC_origin,vecSrc)
                entity_get_vector(ent,EV_TM_mVecEnd,vecEnd)
               
                new pHit,tr = create_tr2()
                engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,tr)
               
                pHit = get_tr2(tr,TR_pHit)
                get_tr2(tr,TR_vecEndPos,vecEnd)
               
                Beam_SetStartPos(beam,vecEnd)
               
                message_begin_f(MSG_PVS,SVC_TEMPENTITY,vecEnd,0)
                write_byte(TE_SPARKS)
                write_coord_f(vecEnd[0])
                write_coord_f(vecEnd[1])
                write_coord_f(vecEnd[2])
                message_end()
               
                if(0 < pHit <= maxPlayers){
                        new team = entity_get_int(ent,EV_TM_team)
                       
                        if(get_user_team(pHit) != team && entity_get_float(pHit,EV_FL_takedamage) != 0.0){
                                if(ExecuteHamB(Ham_TakeDamage,pHit,ent,entity_get_edict(ent,EV_TM_hOwner),MINE_DAMAGE,16777216)){
                                        ExecuteHamB(Ham_TraceBleed,pHit,1337.0,Float:{0.0,0.0,0.0},tr,DMG_ENERGYBEAM)
                                        //client_print(0,print_chat,"Атака")
                                }else{
                                        //client_print(0,print_chat,"Убил")
                                        emit_sound(pHit,CHAN_WEAPON,TRIPMINE_HITSOUND, 1.0, ATTN_NORM, 0, PITCH_NORM )
                                        entity_set_vector(pHit,EV_VEC_velocity,Float:{0.0,0.0,0.0})
                                        cs_set_user_money ( id, min ( cs_get_user_money ( id ) + REWARD_KILL, 16000 ) )
                                }
                        }
                }
                free_tr2(tr)
        }
       
        if(is_valid_ent(ent)){
                TripMine_StatusInfo(ent)
                entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.1)
        }
}
 
TripMine_StatusInfo(ent){
        if(!is_valid_ent(ent))
                return
       
        new player,Float:origin[3],hitEnt,bh
        entity_get_vector(ent,EV_VEC_origin,origin)
       
        while((player = find_ent_in_sphere(player,origin,1024.0))){
                if(player > maxPlayers)
                        break
                       
                if(get_user_team(player) != entity_get_int(ent,EV_TM_team))
                        continue
                       
                get_user_aiming(player,hitEnt,bh)
               
                if(hitEnt != ent)
                        continue
               
                new planterId,planterName[32],team = entity_get_int(ent,EV_TM_team)
               
                planterId = entity_get_edict(ent,EV_TM_hOwner)
                get_user_name(planterId,planterName,charsmax(planterName))
               
                set_dhudmessage(team == 1 ? 150 : 0, 0, team == 2 ? 150 : 0, -1.0, 0.35, 0, 0.0, 0.6, 0.0, 0.0)
                show_dhudmessage(player,"Installed: %s^nHealth: %.0f",planterName,entity_get_float(ent,EV_FL_health))
        }
}
 
//
// Tripmine damage
//
public TripMine_Damage(ent,inflictor,attacker){
        new classname[32]
        entity_get_string(ent,EV_SZ_classname,classname,charsmax(classname))
       
        if(strcmp(classname,TRIPMINE_CLASSNAME) != 0)
                return HAM_IGNORED
               
        entity_set_edict(ent,EV_ENT_dmg_inflictor,attacker)
       
        if(!(0 < attacker <= maxPlayers))
                return HAM_IGNORED
       
        if(entity_get_int(ent,EV_TM_team) == get_user_team(attacker) && entity_get_edict(ent,EV_TM_hOwner) != attacker) // block friendly fire
                return HAM_SUPERCEDE
               
        return HAM_IGNORED
}
 
//
// Tripmine detonate
//
public TripMine_Killed(ent,idattacker){
        new classname[32]
        entity_get_string(ent,EV_SZ_classname,classname,charsmax(classname))
       
        if(strcmp(classname,TRIPMINE_CLASSNAME) != 0)
                return HAM_IGNORED
               
        new beam = entity_get_edict(ent,EV_TM_pBeam)
       
        // remove beam
        if(is_valid_ent(beam))
                UTIL_Remove(beam)
               
        new Float:origin[3],Float:m_vecDir[3]
        entity_get_vector(ent,EV_VEC_origin,origin)
        entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
        //client_print(0,print_chat,"Kill")
        xs_vec_mul_scalar(m_vecDir,8.0,m_vecDir)
        xs_vec_add(origin,m_vecDir,origin)
       
        message_begin_f(MSG_PVS,SVC_TEMPENTITY,origin,0)
        write_byte(TE_EXPLOSION)
        write_coord_f(origin[0])
        write_coord_f(origin[1])
        write_coord_f(origin[2])
        write_short(expSpr)
        write_byte(20)
        write_byte(15)
        write_byte(0)
        message_end()
       
        new killer = entity_get_edict(ent,EV_ENT_dmg_inflictor)
        new hOwner = entity_get_edict(ent,EV_TM_hOwner)

       
        if(!(0 < killer <= maxPlayers) || killer == entity_get_edict(ent,EV_TM_hOwner))
                ColorChat(hOwner,GREEN,"^3[^4LASER^3]^1 your mine was ^4destroyed!!")
        else{
				new exploderName[32]
				get_user_name(killer,exploderName,charsmax(exploderName))
               
				ColorChat(hOwner,GREEN,"^3[^4LASER^3]^4 %s destroyed ^1your mine!",exploderName)

				ColorChat(killer,GREEN,"^3[^4LASER^3]^1 You received ^4%d$ ^1for the destruction of mines!", REWARD_MONEY)
				cs_set_user_money ( killer, min ( cs_get_user_money ( killer ) + REWARD_MONEY, 16000 ) )
        }
       
        return HAM_IGNORED
}
 
//
// Create beam for tripmine
//
TripMine_MakeBeam(ent){
        new beam = Beam_Create(entity_get_int(ent,EV_TM_team) == 1 ? BEAM_SPRITERED : BEAM_SPRITEBLUE,BEAM_WIDTH)
       
        new Float:m_vecDir[3],Float:vecSrc[3],Float:vecOrigin[3]
        entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
        entity_get_vector(ent,EV_VEC_origin,vecSrc)
        xs_vec_copy(vecSrc,vecOrigin)
        xs_vec_mul_scalar(m_vecDir,LASER_LENGTH,m_vecDir)
        xs_vec_add(vecSrc,m_vecDir,vecSrc)
       
        Beam_PointsInit(beam,vecSrc,vecOrigin)
        Beam_SetScrollRate(beam,255.0)
        Beam_SetBrightness(beam,BEAM_BRIGHT)
       
        entity_set_edict(ent,EV_TM_pBeam,beam)
        entity_set_vector(ent,EV_TM_mVecEnd,vecSrc)
        entity_set_edict(beam,EV_ENT_owner,ent)
       
        entity_set_int(beam,EV_TM_mineId,entity_get_int(ent,EV_TM_mineId))
       
        entity_set_float(beam,EV_FL_nextthink,get_gametime() + 0.1)
}
 
Send_BarTime(player,Float:duration){
        if(duration == 0.0){
                ExecuteHamB(Ham_CS_Player_ResetMaxSpeed,player)
        }
       
        message_begin(MSG_ONE,BarTime,.player = player)
        write_short(floatround(duration))
        message_end()
}
 
 
UTIL_Remove( pEntity )
{
        if ( !pEntity )
                return;
               
        entity_set_int(pEntity,EV_INT_flags,entity_get_int(pEntity,EV_INT_flags) | FL_KILLME)
        //entity_set_string(pEntity,EV_SZ_targetname,"")
}

Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Заявка за редактиране на lasermine

Мнение от iv69 » 09 Апр 2020, 00:29

Кроме, а ще може ли оня линк, с който сравнявайки два кода - веднага се виждат "разликите" в тях? За да видя какво още се променя освен добавянето на този ред?
Благодаря.

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

Заявка за редактиране на lasermine

Мнение от OciXCrom » 09 Апр 2020, 00:34


Аватар
iv69
Извън линия
Потребител
Потребител
Мнения: 744
Регистриран на: 17 Мар 2018, 15:34
Се отблагодари: 214 пъти
Получена благодарност: 39 пъти

Заявка за редактиране на lasermine

Мнение от iv69 » 09 Апр 2020, 12:06

Благодаря!!!
Ако не е заключена още - моля да не заключвате..Имам едно питане пак относно този плъгин: Когато парите на един играч стигнат 16000 - по нататък не му дава повече , но само за убийство с лазера ( а иначе си дава пари за обикновено убийство както си му е реда...)- а само показва че уж фиктивно "изважда" по 300.. за убийство, но парите все си седят на 16000, а пък съм с reapi i RegameDll ... и много ми се иска да си се натрупваха до 999 999 , понеже ползвам плъгина на Кром за запазване на парите и след излизане от сървъра? Питам се дали е от плъгина и има ли начин да се оправи това, и да си се натрупват пари и над 16000? А иначе, за жалост сега вече установих, че това "изваждане по 300" - наистина намалява парите на всеки, ако той вече е с над 16000 :(

p.s. Намерих някаква стойност 16000$ - ред 555 ? Мога ли да я променя на 999999$ ?
Оправих се - просто промених стойностите на редове 555 и 665 и стана.
:lock:

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

Обратно към “Заявки за плъгини”

Кой е на линия

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