Русское сообщество по скриптингу

Добавление / изменение точек спавна (Map Spawn Editor)

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только работоспособных плагинов для AMX Mod X. Новые плагины нужно выкладывать в разделе "Новые плагины".

Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение Subb98 » 16 янв 2017, 23:25

Map Spawn Editor v1.0 [обновление от 23.10.2006]

Автор: jopmako
Вы должны зарегистрироваться, чтобы видеть ссылки.

Этот плагин позволит вам (добавлять / удалять / редактировать) точки спавнов на картах без каких-либо усилий.

Зачем это нужно:
  • * Многие карты имеют "плохие" точки спавнов, в которых игрок сразу же умирает; или же точки с плохим расположением, которые также препятствует нормальному появлению игрока на карте.
    • Как мы можем это исправить? Можно использую некоторые инструменты (например, ripent), но это не представляется возможным, находясь в игре.
    • Имея этот плагин, мы получаем возможность делать это прямо в игре.
  • * Насколько это просто?
    1. Используя один плагин и одно меню, вы можете делать две вещи.
    2. Редактировать и изменять точки спавнов, изменять углы точек спавнов в любое время без перезагрузки сервера или смены карты - просто используйте функцию сохранения.
    3. Добавлять и удалять точки спавнов просто перезагрузив карту один раз (вы можете удалить все точки спавнов, если вы захотите).
Консольные команды:
  • amx_spawn_editor 1/0 // Включить / отключить режим редактирования
  • amx_editor_menu // Открыть меню редактора
Требования:
  • AMX Mod X 1.76a или выше
  • Модуль Engine
Инструкция по установке:
  • Поместить файл Map_Spawns_Editor.amxx в <GAME_DIR>/addons/amxmodx/plugins
  • Поместить файл map_spawns_editor.txt в <GAME_DIR>/addons/amxmodx/data/lang
  • Добавить в <GAME_DIR>/addons/amxmodx/configs/plugins.ini строку:

    Код: Выделить всё
    Map_Spawns_Editor.amxx

  1. Загружаем карту, на которой необходимо отредактировать точки спавнов.
  2. Заходим на сервер с ADMIN_BAN доступом и биндим команду amx_editor_menu на любую удобную кнопку.
  3. Выполняем команду amx_spawn_editor 1 в консоли, чтобы включить режим редактирования.
  4. Нажмите забинденную ранее кнопку, чтобы открыть меню редактора.
  5. Сейчас добавляйте / удаляйте / редактируйте точки спавна через меню.
  6. И, наконец, выберите "save all spawns" в меню, когда вы закончили, и изменения будут применены.
    Примечание: если ваш (Editor Spawns) отличается от (Original Spawns), то карта должна быть перезагружена один раз, чтобы изменения вступили в силу.

[2007-02-07] change lang file character format to ASIN for most ppl.(TO chinese user: 下载 map_spawns_editor.txt 后请转换为 UTF-8 格式后再使用)
[2006-10-23] v1.0 Rewrite all code, it's almost a new one.
  • Fixed the Del spawns can not be less than orgign limit.
  • Added change spawn vangle left&right function.
  • Added easily create above player spawn function.
  • Added auto create (spawns) folder function if it's not exist.
  • Added multi-lingual support
  • Added Cvar map_spawns record spawns lets HLSW or Server Tools can see how many spawns in that map.
[2006-08-23] First release. v0.5
  • it works but have more bad code

Благодарности:
Помощь и некоторые участки кода
  • FreeCode, BAILOPAN, VEN, oneofthedragon
  • и другие...
Мультиязычность:
  • [cn]
  • [en] - добавил XxAvalanchexX
  • [pl] - добавил Zuko
  • [es] - добавил KylixMynxAltoLAG
  • [de] - добавил |PJ| Shorty
  • [bp] - добавил commonbullet
  • [nl] - добавил DSI
  • [ro] - добавил Cladyu
У вас нет необходимых прав для просмотра вложений в этом сообщении.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение butkov34 » 27 май 2020, 16:23

Как-то можно сделать условие, чтобы в определенные момент только работал этот плагин? Например если у нас gGameMode = true, то игроки будут возрождаться согласно точкам этого плагина, а если gGameMode = false, то плагин так скажем не будет осуществлять свою функцию?
Аватара пользователя
butkov34
 
Сообщения: 57
Зарегистрирован: 17 апр 2020, 12:14
Благодарил (а): 9 раз.
Поблагодарили: 1 раз.
Языки программирования: Я ничего не знаю

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение MayroN » 27 май 2020, 19:49

butkov34,
Если я правильно понял,то...
На модах ксдм,и гг - если активирован режим спавнов в разных местах и есть соответствующий сам файл для карты,то будут работать рандомные точки спавна.
Если файла нет,то появление на базах закупки
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 150 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение butkov34 » 27 май 2020, 20:08

Да в общем хочу для jb мода сделать csdm мод, ну типо по команде определенной запускался бы csdm мод и вот возник вопрос как бы это всё сделать, а именно спавн игроков в рандомном месте на карте
Аватара пользователя
butkov34
 
Сообщения: 57
Зарегистрирован: 17 апр 2020, 12:14
Благодарил (а): 9 раз.
Поблагодарили: 1 раз.
Языки программирования: Я ничего не знаю

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение MayroN » 27 май 2020, 20:42

butkov34,
Ну я бы просто поставил этот плагин,вручную бы по всех картах наставил бы спавнов и все...
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 150 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение butkov34 » 27 май 2020, 20:45

Я это и хочу сделать, но в каком моменте там надо поставить проверку если включен мод csdm то плагин работает грубо говоря
Аватара пользователя
butkov34
 
Сообщения: 57
Зарегистрирован: 17 апр 2020, 12:14
Благодарил (а): 9 раз.
Поблагодарили: 1 раз.
Языки программирования: Я ничего не знаю

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение butkov34 » 28 май 2020, 00:57

Можете пожалуйста подсказать в каком месте нужно вставить проверку на условие, чтобы игроки спавнились в назначенных точках только при выполнении условия, а если условие не выполняется, то по дефолту?
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <engine>

#define REQUIRED_ADMIN_LEVEL ADMIN_RCON

#define PLUGINNAME   "Map Spawns Editor"
#define VERSION      "1.0.16"
#define AUTHOR      "iG_os"

#define T_MDL     "models/player/leet/leet.mdl"
#define CT_MDL    "models/player/gign/gign.mdl"
#define LINE_SPR  "sprites/laserbeam.spr"

#define CHECKTIMER  0.8
#define CHECKTASKID  666
#define RESETENTITYTASKID  777
#define SAFEp2p 85
#define SAFEp2w 40

#define EDIT_CLASSNAME  "Map_Spawns_Editor"

#define SPAWN_PRESENT_OFFSET 10
#define SPAWN_ABOVE_OFFSET 115

new g_SpawnFile[256], g_DieFile[256], g_EntFile[256]

new 
g_MainMenuID = -1

new bool:g_DeathCheck_end false
new bool:g_LoadSuccessed false
new bool:g_LoadInit true

new bool:g_CheckDistance true

new bool:g_AbovePlayer false
new g_OffSet SPAWN_PRESENT_OFFSET

new g_Editing
new g_SpawnTg_EditT
new g_SpawnCT,g_EditCT
new Laser_Spr
new g_BeamColors[4][3]={{255,0,0},{0,255,0},{200,200,0},{0,0,255}} 


public 
plugin_init()
{
   
register_plugin(PLUGINNAMEVERSIONAUTHOR)
   
register_dictionary("map_spawns_editor.txt")

   
g_LoadInit false // disabled pfn_keyvalue using

   
Spawns_Count()
   new 
string[16]
   
format(string,15,"T(%d) CT(%d)",g_SpawnT,g_SpawnCT)
   
register_cvar("map_spawns",string,FCVAR_SERVER// spawns info for HLSW display

   
register_event("TextMsg""event_restartgame""a""2&#Game_C","2&#Game_w")
   
register_event("DeathMsg""event_death""a")
   
register_event("HLTV""event_newround""a""1=0""2=0")

   
register_clcmd("amx_spawn_editor""editor_onoff"REQUIRED_ADMIN_LEVEL"- 1/0 switch editor function on/off")
   
register_clcmd("amx_editor_menu""editor_menu"REQUIRED_ADMIN_LEVEL"- open editor menu")

}


public 
editor_onoff(id,level,cid)
{
   if (!
cmd_access(id,level,cid,1)) return PLUGIN_HANDLED

   
if (g_Editing && g_Editing!=id){
      
client_print(id,print_chat,"* %L",id,"MSG_ALREADY_INUSE")
      return 
PLUGIN_HANDLED
   
}

   new 
arg[2]
   
read_argv(1,arg,2)
   if (
equal(arg,"1",1) && !g_Editing){
      
g_Editing id
      Clear_AllEdit
(0)
      
Load_SpawnFlie(0)
      
Spawns_To_Edit()
      
client_print(0,print_chat,">> %L - %L",id,"MENU_TITLE",id,"ON")
   }else if (
equal(arg,"0",1)){
      
g_Editing 0
      Clear_AllEdit
(0)
      if (
task_exists(id+CHECKTASKID)) remove_task(id+CHECKTASKID)
      
client_print(0,print_chat,">> %L - %L",id,"MENU_TITLE",id,"OFF")
   }
   return 
PLUGIN_HANDLED 
}


public 
editor_menu(id,level,cid)
{
   if (!
cmd_access(id,level,cid,1))
      return 
PLUGIN_HANDLED

   
if (!g_Editing){
      
client_print(id,print_chat,"* %L",id,"MSG_FUNCTION_DISABLED")
      return 
PLUGIN_HANDLED
   
}

   if (
g_Editing!=id){
      
client_print(id,print_chat,"* %L",id,"MSG_ALREADY_INUSE")
      return 
PLUGIN_HANDLED
   
}

   new 
tempString[101]
   
format(tempString,100,"%L",id,"MENU_TITLE")
   
g_MainMenuID menu_create(tempString"m_MainHandler")
   new 
callbackMenu menu_makecallback("c_Main")

// page 1
   
menu_additem(g_MainMenuID"[Spawns Info]","1"1callbackMenu)
   
menu_addblank(g_MainMenuID0)

   
menu_additem(g_MainMenuID"[Add spawn locate: present/above player]","2"0callbackMenu)
   
format(tempString,100,"%L",id,"MENU_ADD_SPAWN","T")
   
menu_additem(g_MainMenuIDtempString,"3"0callbackMenu)
   
format(tempString,100,"%L",id,"MENU_ADD_SPAWN","CT")
   
menu_additem(g_MainMenuIDtempString,"4"0callbackMenu)
   
menu_addblank(g_MainMenuID0)

   
format(tempString,100,"\y%L",id,"MENU_TURN_LEFT")
   
menu_additem(g_MainMenuIDtempString,"5"0callbackMenu)
   
format(tempString,100,"\y%L",id,"MENU_TURN_RIGHT")
   
menu_additem(g_MainMenuIDtempString,"6"0callbackMenu)
   
menu_addblank(g_MainMenuID0)

   
format(tempString,100,"%L",id,"MENU_SAVE_ALL_SPAWNS")
   
menu_additem(g_MainMenuIDtempString,"7"0callbackMenu)
   
menu_addblank(g_MainMenuID0)
// page 1 end

// page 2
   
menu_additem(g_MainMenuID"[Spawns Info]","11"1callbackMenu)
   
menu_addblank(g_MainMenuID0)

   
menu_additem(g_MainMenuID"[Safe range check on/off]","12"0callbackMenu)
   
format(tempString,100,"%L",id,"MENU_CLEAR_SPAWN")
   
menu_additem(g_MainMenuIDtempString,"13"0callbackMenu)
   
menu_addblank(g_MainMenuID0)

   
format(tempString,100,"%L",id,"MENU_CLEAR_ALL_T_SPAWNS")
   
menu_additem(g_MainMenuIDtempString,"14"0callbackMenu)
   
format(tempString,100,"%L",id,"MENU_CLEAR_ALL_CT_SPAWNS")
   
menu_additem(g_MainMenuIDtempString,"15"0callbackMenu)

   
format(tempString,100,"%L",id,"MENU_DEL_SPAWNS_FILE")
   
menu_additem(g_MainMenuIDtempString,"16"0callbackMenu)

   
format(tempString,100,"%L",id,"MENU_EXPORT_FOR_RIPENT")
   
menu_additem(g_MainMenuIDtempString,"17"0callbackMenu)
   
menu_addblank(g_MainMenuID0)
// page 2 end

   
format(tempString,100,"%L",id,"MENU_EXIT")
   
menu_setprop(g_MainMenuIDMPROP_EXITNAMEtempString)
   
format(tempString,100,"%L",id,"MENU_NEXT")
   
menu_setprop(g_MainMenuIDMPROP_NEXTNAMEtempString)
   
format(tempString,100,"%L",id,"MENU_BACK")
   
menu_setprop(g_MainMenuIDMPROP_BACKNAMEtempString)

   
menu_setprop(g_MainMenuIDMPROP_EXITMEXIT_ALL)
   
menu_display (id,g_MainMenuID,0)

   
client_cmd(id,"spk buttons/button9")
   
set_task(CHECKTIMER,"check_Task",id+CHECKTASKID,_,_,"b")

   return 
PLUGIN_HANDLED 
}

public 
c_Main(idmenuitem)
{
   if (
item 0) return PLUGIN_CONTINUE

   
new cmd[6], fItem[256], iName[64]
   new 
accesscallback
   menu_item_getinfo
(menuitemaccesscmd5iName63callback)
   new 
num str_to_num(cmd)

   if (
num==|| num==11){
      if (
g_EditT!=g_SpawnT || g_EditCT!=g_SpawnCT)
         
format(fItem,255,"%L ( T=%d + CT=%d ) ^n0.\y %L \r( T=%d + CT=%d ) ^n>> %L"id"MENU_ORIGIN_SPAWNS",g_SpawnT,g_SpawnCTid,"MENU_EDIT_SPAWNS"g_EditT,g_EditCTid,"MENU_NOTICE_SAVE")
      else 
format(fItem,255,"%L ( T=%d + CT=%d ) ^n0.\y %L ( T=%d + CT=%d )"id"MENU_ORIGIN_SPAWNS",g_SpawnT,g_SpawnCTid,"MENU_EDIT_SPAWNS"g_EditT,g_EditCT)
      
menu_item_setname(menuitemfItem )
      return 
ITEM_DISABLED
   
}
   switch (
num){
      case 
2:{
         if (
g_AbovePlayer)
            
format(fItem,255,"\y%L ->\r %L",id,"MENU_ADD_LOCATION",id,"MENU_LOCATION_ABOVE")
         else 
format(fItem,255,"\y%L ->\r %L",id,"MENU_ADD_LOCATION",id,"MENU_LOCATION_CURRENT")
         
menu_item_setname(menuitemfItem 
      }
      case 
12:{
         if (
g_CheckDistance)
            
format(fItem,255,"\y%L ->\r %L",id,"MENU_SAFE_CHECK",id,"ON")
         else 
format(fItem,255,"\y%L ->\r %L",id,"MENU_SAFE_CHECK",id,"OFF")
         
menu_item_setname(menuitemfItem 
      }
   }
   return 
ITEM_ENABLED 
}

public 
m_MainHandler(idmenuitem)
{
   if (
item==MENU_EXIT || !g_Editing){
      if (
task_exists(id+CHECKTASKID)) remove_task(id+CHECKTASKID)
      
menu_destroy(g_MainMenuID)
      return 
PLUGIN_HANDLED
   
}

   new 
cmd[6], iName[64
   new 
accesscallback 
   menu_item_getinfo
(menuitemaccesscmd,5iName63callback
   new 
iChoice str_to_num(cmd
   
   switch(
iChoice)
   {
      case 
2:{ // Location Set
         
if (g_AbovePlayer){
            
g_OffSet SPAWN_PRESENT_OFFSET
            g_AbovePlayer 
false
         
}else{
            
g_OffSet SPAWN_ABOVE_OFFSET
            g_AbovePlayer 
true
         
}
         
client_cmd(id,"spk buttons/button3")
      }
      case 
3:{ // Add T Spawn
         
if (g_CheckDistance && !SafeRangeCheck(id,g_OffSet)){
            
client_cmd(id,"spk buttons/button2")
            
client_print(0,print_chat,">> %L",id,"MSG_CHECK_FAULT")
         }
         else if (
CreateEditEntity(1,id,g_OffSet)==1){
            
g_EditT++
            
client_cmd(id,"spk buttons/button9")
            
client_print(0,print_chat,">> %L",id,"MENU_ADD_SPAWN","T")
         }
      }
      case 
4:{ // Add CT Spawn
         
if (g_CheckDistance && !SafeRangeCheck(id,g_OffSet)){
            
client_cmd(id,"spk buttons/button2")
            
client_print(0,print_chat,">> %L",id,"MSG_CHECK_FAULT")
         }
         else if (
CreateEditEntity(2,id,g_OffSet)==2){
            
g_EditCT++
            
client_cmd(id,"spk buttons/button9")
            
client_print(0,print_chat,">> %L",id,"MENU_ADD_SPAWN","CT")
         }
      }
      case 
5:{ // Spawn Turn Left
         
new entity Get_Edit_Point_By_Aim(id)
         if (
entity && is_valid_ent(entity)){
            
Entity_Turn_angle(entity,10)
            
client_cmd(id,"spk buttons/blip1")
         }else{
            
client_cmd(id,"spk buttons/button2")
            
client_print(0,print_chat,">> %L",id,"ERROR_POINT_NOTFOUND")
         }
      }
      case 
6:{ // Spawn Turn Right
         
new entity Get_Edit_Point_By_Aim(id)
         if (
entity && is_valid_ent(entity)){
            
Entity_Turn_angle(entity,-10)
            
client_cmd(id,"spk buttons/blip1")
         }else{
            
client_cmd(id,"spk buttons/button2")
            
client_print(0,print_chat,">> %L",id,"ERROR_POINT_NOTFOUND")
         }
      }
      case 
7:{ // Save All Spawn To File
         
if (Save_SpawnsFile()){
            
Load_SpawnFlie(0)
            
client_cmd(id,"spk buttons/blip2")
            
client_print(0,print_chat,">> %L (T=%d,CT=%d)",id,"MSG_SAVE_SPAWNSFLIE",g_EditT,g_EditCT)
         }else
            
client_print(0,print_chat,">> %L",id,"ERROR_SAVE_SPAWNSFLIE")
      }
      case 
12:{ // Safe Range Check
         
g_CheckDistance g_CheckDistance false:true
         client_cmd
(id,"spk buttons/button3")
      }
      case 
13:{ // Clear a Spawn
         
new entity Get_Edit_Point_By_Aim(id)
         if (
entity && is_valid_ent(entity)){
            new 
team entity_get_int(entity,EV_INT_iuser2)
            
remove_entity(entity)
            
client_cmd(id,"spk buttons/button3")
            if (
team==1){
               
g_EditT--
               
client_print(0,print_chat,">> %L",id,"MSG_CLEAR_SPAWN","T")
            }else{
               
g_EditCT--
               
client_print(0,print_chat,">> %L",id,"MSG_CLEAR_SPAWN","CT")
            }
         }else{
            
client_cmd(id,"spk buttons/button2")
            
client_print(0,print_chat,">> %L",id,"ERROR_POINT_NOTFOUND")
         }
      }
      case 
14:{ // Clear All T Spawn
         
Clear_AllEdit(1)
         
client_cmd(id,"spk buttons/blip2")
         
client_print(0,print_chat,">> %L",id,"MENU_CLEAR_ALL_T_SPAWNS")
      }
      case 
15:{ // Clear All CT Spawn
         
Clear_AllEdit(2)
         
client_cmd(id,"spk buttons/blip2")
         
client_print(0,print_chat,">> %L",id,"MENU_CLEAR_ALL_CT_SPAWNS")
      }
      case 
16:{ // Del Spawns Flie
         
if (file_exists(g_SpawnFile)){
            
delete_file(g_SpawnFile)
            
client_cmd(id,"spk buttons/blip2")
            
client_print(0,print_chat,">> %L",id,"MSG_DEL_SPAWNSFILE")
         }
      }
      case 
17:{ // Expotr Spawn To ENT Format
         
if (Export_RipentFormatFile()){
            
client_cmd(id,"spk buttons/blip2")
            
client_print(0,print_chat,">> %L [%s] (T=%d,CT=%d)",id,"MSG_EXOPRT_SPAWNSFLIE",g_EntFile,g_EditT,g_EditCT)
         }
      }
   }

   if (
iChoice>=11 && iChoice<=17)  // go back to second page is using
      
menu_display (idg_MainMenuID1)
   else 
menu_display (idg_MainMenuID0)
   return 
PLUGIN_CONTINUE 
}


public 
plugin_precache()
{
   new 
configdir[128]
   
get_configsdir(configdir127 )
   new 
spawndir[256]
   
format(spawndir,255,"%s/spawns",configdir)
   if (!
dir_exists(spawndir)){
      if (
mkdir(spawndir)==0){ // Create a dir,if it's not exist
         
log_amx("Create [%s] dir successfully finished.",spawndir)
      }else{
         
log_error(AMX_ERR_NOTFOUND,"Couldn't create [%s] dir,plugin stoped.",spawndir)
         
pause("ad")
         return 
PLUGIN_CONTINUE
      
}
   }

   
precache_model(T_MDL)
   
precache_model(CT_MDL)
   
Laser_Spr precache_model(LINE_SPR)

   new 
MapName[32]
   
get_mapname(MapName31)
   
//store spawns point data in this file
   
format(g_SpawnFile255"%s/%s_spawns.cfg",spawndirMapName)
   
//when restart game some bad spawn point will make user die,store data in this file,it's useful.
   
format(g_DieFile255"%s/%s_spawns_die.cfg",spawndirMapName)
   
//export spawns data to this file for ripent.exe format,it's useful for import to bsp for ripent.exe
   
format(g_EntFile255"%s/%s_ent.txt",spawndirMapName)

   if (
Load_SpawnFlie(1)) //load spawn file and create player spawn points
      
g_LoadSuccessed true
   
else
      
g_LoadSuccessed false

   
return PLUGIN_CONTINUE
}

//load spawns from file, Return 0 when didn't load anything.
stock Load_SpawnFlie(type//createEntity = 1 create an entity when load a point
{
   if (
file_exists(g_SpawnFile))
   {
      new 
ent_Tent_CT
      
new Data[128], lenline 0
      
new team[8], p_origin[3][8], p_angles[3][8]
      new 
Float:origin[3], Float:angles[3]

      while((
line read_file(g_SpawnFile line Data 127 len) ) != 
      {
         if (
strlen(Data)<2) continue

         
parse(Datateam,7p_origin[0],7p_origin[1],7p_origin[2],7p_angles[0],7p_angles[1],7p_angles[2],7)
         
         
origin[0] = str_to_float(p_origin[0]); origin[1] = str_to_float(p_origin[1]); origin[2] = str_to_float(p_origin[2]);
         
angles[0] = str_to_float(p_angles[0]); angles[1] = str_to_float(p_angles[1]); angles[2] = str_to_float(p_angles[2]);

         if (
equali(team,"T")){
            if (
type==1ent_T create_entity("info_player_deathmatch")
            else 
ent_T find_ent_by_class(ent_T"info_player_deathmatch")
            if (
ent_T>0){
               
entity_set_int(ent_T,EV_INT_iuser1,1// mark that create by map spawns editor
               
entity_set_origin(ent_T,origin)
               
entity_set_vector(ent_TEV_VEC_anglesangles)
            }
         }
         else if (
equali(team,"CT")){
            if (
type==1ent_CT create_entity("info_player_start")
            else 
ent_CT find_ent_by_class(ent_CT"info_player_start")
            if (
ent_CT>0){
               
entity_set_int(ent_CT,EV_INT_iuser1,1// mark that create by map spawns editor
               
entity_set_origin(ent_CT,origin)
               
entity_set_vector(ent_CTEV_VEC_anglesangles)
            }
         }
      }
      return 
1
   
}
   return 
0
}

// pfn_keyvalue..Execure after plugin_precache and before plugin_init
public pfn_keyvalue(entid)
{  
// when load custom spawns file successed,we are del all spawns by map originate create
   
if (g_LoadSuccessed && !g_LoadInit){
      new 
classname[32], key[32], value[32]
      
copy_keyvalue(classname31key31value31)

      if (
equal(classname"info_player_deathmatch") || equal(classname"info_player_start")){
         if (
is_valid_ent(entid) && entity_get_int(entid,EV_INT_iuser1)!=1//filter out custom spawns
            
remove_entity(entid)
      }
   }
   return 
PLUGIN_CONTINUE
}


public 
event_restartgame()
{
   if (
g_Editing && file_exists(g_DieFile))
      
delete_file(g_DieFile)

   
g_DeathCheck_end false

   
if (g_Editing){
      
Clear_AllEdit(0)
      
Load_SpawnFlie(0)
      
Spawns_To_Edit()
   }
   return 
PLUGIN_CONTINUE
}

// Remove & save bad spawn point where force user die.
public event_death()
{
   if (!
g_DeathCheck_end){
      new 
string[12]
      
read_data(4,string,11)
      if (
equal(string,"worldspawn")){
         new 
id read_data(2)
         if (
g_Editing){
            new 
entList[1],team
            find_sphere_class
(id,EDIT_CLASSNAME30.0entList1)
            if (
entList[0]){
               
team entity_get_int(entList[0],EV_INT_iuser2// team mark
               
if (team==1){
                  
client_print(0,print_chat,">> %L",id,"MSG_AUTO_REMOVE_SPAWN","T")
                  
g_EditT--
               }else{
                  
client_print(0,print_chat,">> %L",id,"MSG_AUTO_REMOVE_SPAWN","CT")
                  
g_EditCT--
               }
               
remove_entity(entList[0])
               return 
PLUGIN_CONTINUE
            
}
         }else{
            new 
team get_user_team(id)
            if (
team==1Point_WriteToFlie(g_DieFile,1,id,1)
            else if (
team==2Point_WriteToFlie(g_DieFile,2,id,1)
         }
      }
   }
   return 
PLUGIN_CONTINUE
}

public 
event_newround()
   
set_task(3.0,"deathCheck_end")

public 
deathCheck_end()
   
g_DeathCheck_end true


// create a edit point
stock CreateEditEntity(team,iEnt,offset)
{
   new 
Float:fOrigin[3],Float:fAngles[3]
   
entity_get_vector(iEntEV_VEC_originfOrigin)
   
entity_get_vector(iEntEV_VEC_anglesfAngles)
   
fOrigin[2] += float(offset//offset Z

   
new entity create_entity("info_target")
   if (
entity){
      
entity_set_string(entityEV_SZ_classnameEDIT_CLASSNAME)
      
entity_set_model(entity,(team==1) ? T_MDL:CT_MDL)
      
entity_set_origin(entityfOrigin)
      
entity_set_vector(entityEV_VEC_anglesfAngles)
      
entity_set_int(entityEV_INT_sequence4)
      
entity_set_int(entity,EV_INT_iuser2,team// team mark
      
return team
   
}
   return 
0
}

// clear up all edit points
stock Clear_AllEdit(team){
   new 
entity
   
switch (team){
      case 
0:{
         while ((
entity find_ent_by_class(entityEDIT_CLASSNAME)))
            
remove_entity(entity)
         
g_EditT 0
         g_EditCT 
0
      
}
      case 
1:{
         while ((
entity find_ent_by_class(entityEDIT_CLASSNAME)))
            if (
entity_get_int(entity,EV_INT_iuser2)==1)
               
remove_entity(entity)
         
g_EditT 0
      
}
      case 
2:{
         while ((
entity find_ent_by_class(entityEDIT_CLASSNAME)))
            if (
entity_get_int(entity,EV_INT_iuser2)==2)
               
remove_entity(entity)
         
g_EditCT 0
      
}
   }
}

// convert origin spawns to edit points
stock Spawns_To_Edit()
{
   new 
entity
   g_EditT 
0
   
while ((entity find_ent_by_class(entity"info_player_deathmatch"))){
      
CreateEditEntity(1,entity,0)
      
g_EditT++
   }
   
entity 0
   g_EditCT 
0
   
while ((entity find_ent_by_class(entity"info_player_start"))){
      
CreateEditEntity(2,entity,0)
      
g_EditCT++
   }
}

stock Spawns_Count()
{
   new 
entity
   g_SpawnT 
0
   
while ((entity find_ent_by_class(entity"info_player_deathmatch")))
      
g_SpawnT++

   
entity 0
   g_SpawnCT 
0
   
while ((entity find_ent_by_class(entity"info_player_start")))
      
g_SpawnCT++
}

public 
check_Task(taskid){
   
SafeRangeCheck(taskid-CHECKTASKID,SPAWN_PRESENT_OFFSET)
   
Get_Edit_Point_By_Aim(taskid-CHECKTASKID)
}

// reset entity sequence
public reset_entity_stats(param){
   new 
entity param RESETENTITYTASKID
   
if (is_valid_ent(entity)){
      
entity_set_float(entityEV_FL_animtime0.0)
      
entity_set_float(entityEV_FL_framerate0.0)
      
entity_set_int(entityEV_INT_sequence4)
   }
}

// set entity vangle[1]+turn
stock Entity_Turn_angle(entity,turn){
   if (
is_valid_ent(entity)){
      new 
Float:fAngles[3]
      
entity_get_vector(entityEV_VEC_anglesfAngles)
      
fAngles[1] += turn
      
if (fAngles[1]>=360fAngles[1] -= 360
      
if (fAngles[1]<0fAngles[1] += 360
      entity_set_vector
(entityEV_VEC_anglesfAngles)
   }
}

// check edit point or wall distance to id
stock SafeRangeCheck(id,offset)
{
   new 
safepostion 1
   
new Float:fOrigin[3],Float:fAngles[3],Float:inFrontPoint[3],Float:HitPoint[3]
   
entity_get_vector(idEV_VEC_originfOrigin)
   
fOrigin[2] += offset // hight offset,same as Edit Point offset
   
entity_get_vector(idEV_VEC_anglesfAngles)

   for (new 
i=0;i<360;i+=10)
   {
      
fAngles[1] = float(i)
      
// get the id infront point for trace_line
      
Vector_By_Angle(fOrigin,fAnglesSAFEp2w 2.01inFrontPoint)

      
// check id nearby wall
      
trace_line(-1,fOrigin,inFrontPoint,HitPoint)
      new 
distance floatround(vector_distance(fOriginHitPoint))

      if (
distance<SAFEp2w){ // unsafe distance to wall
         
Make_TE_BEAMPOINTS(id,0,fOrigin,HitPoint,2,255)
         
safepostion 0
      
}
      else if (
distance SAFEp2w 1.5)
         
Make_TE_BEAMPOINTS(id,2,fOrigin,HitPoint,2,255)
   }

   
// check id nearby Edit Points
   
new entList[10],Float:vDistance
   
new Float:entity_origin[3]
   
find_sphere_class(0,EDIT_CLASSNAMESAFEp2p 1.5entList9fOrigin)
   for(new 
i=0;i<10;i++){
      if (
entList[i]){
         
entity_get_vector(entList[i], EV_VEC_originentity_origin)
         
vDistance vector_distance(fOrigin,entity_origin)
         if (
vDistance SAFEp2p){ // unsafe location to Edit Points
            
Make_TE_BEAMPOINTS(id,0,fOrigin,entity_origin,5,255)
            
entity_set_int(entList[i], EV_INT_sequence64)
            
safepostion 0
            
if (task_exists(entList[i]+RESETENTITYTASKID)) 
               
remove_task(entList[i]+RESETENTITYTASKID)
            
set_task(CHECKTIMER+0.1,"reset_entity_stats",entList[i]+RESETENTITYTASKID)
         } else 
Make_TE_BEAMPOINTS(id,1,fOrigin,entity_origin,5,255)
      }
   }
   return 
safepostion
}


stock Get_Edit_Point_By_Aim(id)
{
   new 
entList[1],team
   
new Float:fOrigin[3],Float:vAngles[3],Float:vecReturn[3]
   
entity_get_vector(idEV_VEC_originfOrigin)
   
fOrigin[2] += 10 // offset Z of id
   
entity_get_vector(idEV_VEC_v_anglevAngles)

   for(new 
Float:i=0.0;i<=1000.0;i+=20.0)
   {
      
Vector_By_Angle(fOrigin,vAngles,i,1,vecReturn)
      
//Make_TE_BEAMPOINTS(id,3,fOrigin,vecReturn,5,255)
      //client_print(0,print_chat,"fOrigin={%d,%d,%d},vecReturn={%d,%d,%d}",floatround(fOrigin[0]),floatround(fOrigin[1]),floatround(fOrigin[2]),floatround(vecReturn[0]),floatround(vecReturn[1]),floatround(vecReturn[2]))

      
find_sphere_class(0,EDIT_CLASSNAME20.0entList1vecReturn)
      if (
entList[0]){
         
// let entity have anim.
         
entity_set_float(entList[0], EV_FL_animtime1.0)
         
entity_set_float(entList[0], EV_FL_framerate1.0)
         
team entity_get_int(entList[0],EV_INT_iuser2)
         
client_print(id,print_center,"%L #%d",id,"MSG_AIM_SPAWN",(team==1) ? "T":"CT",entList[0])
         if (
task_exists(entList[0]+RESETENTITYTASKID)) 
            
remove_task(entList[0]+RESETENTITYTASKID)
         
set_task(CHECKTIMER+0.1,"reset_entity_stats",entList[0]+RESETENTITYTASKID)
         break
      }
   }
   return 
entList[0// return entity if be found
}


/* FRU define in vector.inc
#define ANGLEVECTOR_FORWARD      1
#define ANGLEVECTOR_RIGHT        2
#define ANGLEVECTOR_UP           3
*/
stock Vector_By_Angle(Float:fOrigin[3],Float:vAngles[3], Float:multiplierFRUFloat:vecReturn[3])
{
   
angle_vector(vAnglesFRUvecReturn)
   
vecReturn[0] = vecReturn[0] * multiplier fOrigin[0]
   
vecReturn[1] = vecReturn[1] * multiplier fOrigin[1]
   
vecReturn[2] = vecReturn[2] * multiplier fOrigin[2]
}


// draw laserBeam
stock Make_TE_BEAMPOINTS(id,color,Float:Vec1[3],Float:Vec2[3],width,brightness){
   
message_begin(MSG_ONE_UNRELIABLE ,SVC_TEMPENTITY,{0,0,0},id)
   
write_byte(TE_BEAMPOINTS// TE_BEAMPOINTS = 0
   
write_coord(floatround(Vec1[0])) // start position
   
write_coord(floatround(Vec1[1]))
   
write_coord(floatround(Vec1[2]))
   
write_coord(floatround(Vec2[0])) // end position
   
write_coord(floatround(Vec2[1]))
   
write_coord(floatround(Vec2[2]))
   
write_short(Laser_Spr// sprite index
   
write_byte(1// starting frame
   
write_byte(0// frame rate in 0.1's
   
write_byte(4// life in 0.1's
   
write_byte(width// line width in 0.1's
   
write_byte(0// noise amplitude in 0.01's
   
write_byte(g_BeamColors[color][0])
   
write_byte(g_BeamColors[color][1])
   
write_byte(g_BeamColors[color][2])
   
write_byte(brightness// brightness)
   
write_byte(0// scroll speed in 0.1's
   
message_end()
}


stock Save_SpawnsFile()
{
   if (
file_exists(g_SpawnFile))
      
delete_file(g_SpawnFile)

   new 
mapname[32],line[128]
   
get_mapname(mapname,31)
   
format(line,127,"/* %s T=%d,CT=%d */ Map Spawns Editor Format File",mapname,g_EditT,g_EditCT)
   
write_file(g_SpawnFileline, -1)

   new 
entity,team
   
while ((entity find_ent_by_class(entityEDIT_CLASSNAME))){
      
team entity_get_int(entity,EV_INT_iuser2)
      
Point_WriteToFlie(g_SpawnFile,team,entity,1)
   }

   return 
1
}

stock Export_RipentFormatFile()
{
   if (
file_exists(g_EntFile))
      
delete_file(g_EntFile)

   new 
entity,team
   
while ((entity find_ent_by_class(entityEDIT_CLASSNAME))){
      
team entity_get_int(entity,EV_INT_iuser2)
      
Point_WriteToFlie(g_EntFile,team,entity,2)
   }
   return 
1
}

// store one entity data to file
stock Point_WriteToFlie(Flie[],team,entity,saveformat)
{
   new 
line[128],sTeam[32]
   new 
nOrigin[3],nAngles[3]
   new 
Float:fOrigin[3],Float:fAngles[3]

   
entity_get_vector(entityEV_VEC_originfOrigin)
   
entity_get_vector(entityEV_VEC_anglesfAngles)
   
FVecIVec(fOrigin,nOrigin)
   
FVecIVec(fAngles,nAngles)
   if (
nAngles[1]>=360nAngles[1] -= 360
   
if (nAngles[1]<0nAngles[1] += 360

   
if (saveformat==1){ // write for plugin using format
      
if (team==1sTeam "T"
      
else sTeam "CT"
      
format(line127"%s %d %d %d %d %d %d"sTeamnOrigin[0], nOrigin[1], nOrigin[2], 0nAngles[1], 0)
      
write_file(Flieline, -1)
   }
   else if (
saveformat==2){ // write for ripent.exe format
      
if (team==1sTeam "info_player_deathmatch"
      
else sTeam "info_player_start"
      
format(line127,"{^n  ^"classname^" ^"%s^"",sTeam)
      
write_file(Flieline , -1)
      
format(line127"  ^"origin^" ^"%%%d^""nOrigin[0], nOrigin[1], nOrigin[2])
      
write_file(Flieline, -1)
      
format(line127"  ^"angle^" ^"%d 0^"^n}^n"nAngles[1])
      
write_file(Flieline, -1)
   }
}

//////////////////////////////////////////////////////////
/* export spawns data to txt file for ripent.exe format */
/* 
{ //(T)
"classname" "info_player_deathmatch"
"origin" "-384 1056 108"
"angle" "0 180 0"
}
{ //(CT)
"classname" "info_player_start"
"origin" "-128 -832 104"
"angle" "0 270 0"
}
*/
//////////////////////////////////////////////////////////

 
Аватара пользователя
butkov34
 
Сообщения: 57
Зарегистрирован: 17 апр 2020, 12:14
Благодарил (а): 9 раз.
Поблагодарили: 1 раз.
Языки программирования: Я ничего не знаю

Re: Добавление / изменение точек спавна (Map Spawn Editor)

Сообщение Fedcomp » 09 июн 2020, 08:00

спавнить их самостоятельно где надо?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4939
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 815 раз.
Поблагодарили: 1319 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust


Вернуться в Утвержденные плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1