|
|
|
Канал X3: Terran Conflict »
Модовый и скриптовый отсек X3: Terran Conflict: «[ДИСКУС]: Скриптописание. Проблемы и их решение.» |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
Не совсем тот код, что был в начале, но думаю суть будет ясна.
Так работает: добавляю в массив саму переменную $center.position. И, следовательно, при изменении переменной в архив добавляются новые значения дополнительно к старым.
Код: |
053 $count=-1
054 while$count < 4
055 |inc $count=
056 |$X0=( $X1 + $X2 ) / 2
057 |$Y0=( $Y1 + $Y2 ) / 2
058 |$Z0=( $Z1 + $Z2 ) / 2
059 |$center.position[0] = $X0
060 |$center.position[1] = $Y0
061 |$center.position[2] = $Z0
062 |$distance=get distance: position array1=$position.1 array2=$center.position
------------------------------
063 |$XYZ=clone array $center.position : index 0 ... 2
064 |append $XYZ to array $coords
------------------------------
065 |$X2=$center.position[0]
066 |$Y2=$center.position[1]
067 |$Z2=$center.position[2]
068 @ |=wait 100 ms
069 |skip if$distance >= 13000
070 ||goto label get.coords
071 end |
Так не работает: добавляю в массив указатель на переменную $center.position, а не саму переменную. И, следовательно, при изменении переменной данные в массиве тоже меняются.
Код: |
053 $count=-1
054 while$count < 4
055 |inc $count=
056 |$X0=( $X1 + $X2 ) / 2
057 |$Y0=( $Y1 + $Y2 ) / 2
058 |$Z0=( $Z1 + $Z2 ) / 2
059 |$center.position[0] = $X0
060 |$center.position[1] = $Y0
061 |$center.position[2] = $Z0
062 |$distance=get distance: position array1=$position.1 array2=$center.position
------------------------------
063
064 |append $center.position to array $coords
------------------------------
065 |$X2=$center.position[0]
066 |$Y2=$center.position[1]
067 |$Z2=$center.position[2]
068 @ |=wait 100 ms
069 |skip if$distance >= 13000
070 ||goto label get.coords
071 end |
В коде append, но в варианте с insert тоже не работало, либо работало не так как нужно. Я два вечера голову ломал, пока не понял разницу между переменной и указателем на нее.
_________________ Пираты - наше всё!
Последний раз редактировалось: za4ot (17:55 16-03-2021), всего редактировалось 5 раз(а) |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
za4ot : |
добавляю в массив указатель на переменную $center.position, а не саму переменную.
|
Не пойму, по ходу бред какой-то , это как - указатель на переменную
Вообще-то переменная является указателем на массив
И если сделать вот так
$Array = array alloc: size=0
$NewArray = $Array
то в данном случай $NewArray не будет новым массивом, это будет указателем на созданный ранее массив $Array и все изменения с $NewArray будут на самом деле происходить с $Array. Чтобы получить новый массив но точную копию уже существующего нужно сделать
$NewArray = clone array $Array : index 0 ... null
_________________________________________
Просто сначала ты говоришь об одном, а потом совсем о другом, если честно я так и не понял причём здесь твоя проблема с insert $Value into array $Array at index 0
С данной командой у меня никогда не было проблем.
_________________ Очевидное-невероятное |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
DNA78 : |
это как - указатель на переменную Вообще-то переменная является указателем на массив
|
Я в терминологии никогда силен не был. Мне как-то пытались объяснить, что я неправильно использую термин флаги, но мы так друг друга и не поняли.
Массив $coords содержит два элемента. Скажем 28000, 0, 0 и 0, 0, -28000 - цифры пишу по памяти но не суть.
Код: |
053 $count=-1
054 while$count < 4
055 |inc $count=
056 |$X0=( $X1 + $X2 ) / 2
057 |$Y0=( $Y1 + $Y2 ) / 2
058 |$Z0=( $Z1 + $Z2 ) / 2
059 |$center.position[0] = $X0
060 |$center.position[1] = $Y0
061 |$center.position[2] = $Z0
062 |$distance=get distance: position array1=$position.1 array2=$center.position
------------------------------
063
064 |insert $center.position into array $coords at index 1
------------------------------
065 |$X2=$center.position[0]
066 |$Y2=$center.position[1]
067 |$Z2=$center.position[2]
068 @ |=wait 100 ms
069 |skip if$distance >= 13000
070 ||goto label get.coords
071 end |
После первого витка (находим середину между точками (28000, 0, 0) и (0, 0, -28000) цикла массив $coords содержит 3 элемента (28000, 0, 0); (14000, 0, -14000); (0, 0, -28000). После второго витка (находим середину между точками (28000, 0, 0) и (14000, 0, -14000) цикла массив $coords опять содержит 3 элемента но уже такие (28000, 0, 0); (21000, 0, -7000); (0, 0, -28000). То есть на втором витке элемент массива с индексом 1 был заменен новым значением, а размер массива не увеличился. То же самое происходило на 3 и 4 витках цикла. Как-то так. И только после того как я изменил код вот так
Код: |
------------------------------
063 |$XYZ=clone array $center.position : index 0 ... 2
064 |insert $XYZ into array $coords at index 1
------------------------------
|
все заработало как нужно.
В итоге, получается, что если в цикле переменную (в нашем случае содержащую массив) записать в массив, изменить ее и снова записать в массив, то что-то идет не так.
_________________ Пираты - наше всё!
Последний раз редактировалось: za4ot (19:51 16-03-2021), всего редактировалось 5 раз(а) |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
Подскажите (если можно примером) как именно локальной переменной, передать указатель на станцию в вызываемый скрипт.
Приходится держать её постоянно в прицеле, а я хочу просто указать на неё в первом скрипте.
Вот отрывок из скрипта:
* Станция $station взята в прицел.
001 $station=get player tracking aim
* Локальные переменные для переноса данных.
002 [THIS] ->set local variable: name='STATION' value=$station
003 $station ->set local variable: name='TIME_HACKER' value=$time
004 $station ->set local variable: name='COST_HACKER' value=$cost
* Локальные переменные для приёма данных.
002 $station=[THIS] -> get local variable: name='STATION'
003 $time=$station -> get local variable: name='TIME_HACKER'
004 $cost=$station -> get local variable: name='COST_HACKER'
Переменные денег $cost и времени $time переносятся нормально (привязал к станции в прицеле), а саму станцию $station не получается.
Собственно я перенёс Глобальной переменной, но всё же интересно, как это сделать Локальной пер. ?
_________________ На фоне космоса - человечество, всего лишь пыль!
Последний раз редактировалось: Thug (19:05 18-03-2021), всего редактировалось 2 раз(а) |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
Что должен делать скрипт? Алгоритм примерный.
_________________ Пираты - наше всё! |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Thug : |
Подскажите (если можно примером) как именно локальной переменной, передать указатель на станцию в вызываемый скрипт.
|
А что, мы пишем скрипты, а как передавать аргументы из скрипта в скрипт незнаем?
Элементарно:
из скрипта (кликните здесь для просмотра)
= null-> call script 'скрипт приёмник' : arg1=$station arg2=$time arg3=$cost
|
скрипт приёмник (кликните здесь для просмотра)
Аргументы используемые скриптом:
Имя | Тип | Описание | station | Var/Station | Station of tracking | time | Var/Number | Time | cost | Var/Number | Cost |
|
добавлено спустя 43 минуты:
Thug : |
002 [THIS] ->set local variable: name='STATION' value=$station
|
Thug : |
002 $station=[THIS] -> get local variable: name='STATION'
|
А [THIS] в данных случаях это что?
_________________ Очевидное-невероятное
Последний раз редактировалось: DNA78 (08:20 19-03-2021), всего редактировалось 2 раз(а) |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
Цитата: |
...Что должен делать скрипт? Алгоритм примерный...
...А что, мы пишем скрипты, а как передавать аргументы незнаем?
...А [THIS] в данных случаях это что?
|
Друзья, отбросим всё и простой пример: Мы находимся в секторе, перед нами станция...
В первом скрипте обозначены параметры: Сектор($sector); Станция($station);
Во втором скрипте есть только Сектор-$sector ($sector=[PLAYERSHIP] -> get sector).
Надо передать значение: Станция($station) с помощью локальной переменной.
1Скрипт - [THIS] ->set local variable: name='STATION' value=$station
2Скрипт - $station=[THIS] -> get local variable: name='STATION'
Скрипты связаны инструкцией: send incoming question $msg to player: callback= на два варианта ответа.
С этой инструкцией я не знаю как переносить указатель на объект, поэтому и использую локальную переменную...
Я пробовал вместо [THIS] указать $sector или $station.
Но в том то и дело, что не работает... Легко перенёс глобальной переменной, но загадка то на разгадана???
_________________ На фоне космоса - человечество, всего лишь пыль! |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
Всё одно не понятно. Забудь про скрипты. Просто скажи с чего куда и что ты хочешь сделать. Как это должно в игре выглядеть?
_________________ Пираты - наше всё! |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Thug : |
Легко перенёс глобальной переменной, но загадка то на разгадана???
|
Да что тут загадочного я не пойму. Я ещё раз спрашиваю, что такое в эти двух твоих скриптах [THIS]?
Thug : |
Я пробовал вместо [THIS] указать $sector или $station.
|
На сектор ты не сможешь повесить локальную переменную, а если вешаешь её на станцию, то со станции её и нужно снимать, а не с [THIS]
Сделай вот так и все будет работать:
скрипт (1)
Код: |
$Ship = get player ship
$Station = get player tracking aim
$Ship -> set local variable: name='STATION_AIM' value=$Station
return null |
скрипт (2)
Код: |
$Ship = get player ship
$Station = $Ship -> get local variable: name='STATION_AIM'
return null |
Ну и естественно если сменишь корабль то и переменная твоя останется на другом корабле.
Всё просто до безобразия. Учите матчасть сударь.
_________________ Очевидное-невероятное
Последний раз редактировалось: DNA78 (17:58 19-03-2021), всего редактировалось 2 раз(а) |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
DNA78 : |
Сделай вот так и все будет работать:
|
Я почти так и делал...
1 Скрипт:
001 $station=get player tracking aim
002 $sector=$station -> get sector
003 $sector ->set local variable: name='STATION' value=$station
2 Скрипт:
001 $Sector=[PLAYERSHIP] -> get sector
002 $station=$Sector -> get local variable: name='STATION'
Ошибку я допустил сам:
Внимательно пересмотрел скрипт и нашёл причину... Просто скрипт большой (150 строк) и сразу не заметил...
В первом скрипте, поставил $sector=$station -> get sector, ниже локальной переменной со значением $station - разумеется она не сработала.
И вынес всем мозг на сайте Ну простите...
_________________ На фоне космоса - человечество, всего лишь пыль! |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Thug : |
1 Скрипт:
001 $station=get player tracking aim
002 $sector=$station -> get sector
003 $sector ->set local variable: name='STATION' value=$station
2 Скрипт:
001 $Sector=[PLAYERSHIP] -> get sector
002 $station=$Sector -> get local variable: name='STATION'
|
Ты нас здесь за дураков держишь или как Я тебе в предыдущем посте написал, что на сектор ты не сможешь повесить локальную переменную, так ты мне в следующем посте пишешь, что это у тебя работает на секторе, что за бред вообще
_________________ Очевидное-невероятное |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
Игра Х3ТС-АР3.1 Специально удалил из скриптов всё лишнее и проверил ещё раз - увы, но работает...
1.Скрипт: 'A.....A.Thug.Hacker'
001 $station=get player tracking aim
002 $sector=$station -> get sector
003 $sector ->set local variable: name='ST' value=$station
004 *$msg=sprintf: pageid=7523 textid=400, $Pl.Name, $name, $sector, $cost.str, $time.str
005 send incoming question $msg to player: callback='A.....A.Thug.Hacker2'
006 return null
2.Скрипт: 'A.....A.Thug.Hacker2'
001 $sector=[PLAYERSHIP] -> get sector
002 $station=$sector -> get local variable: name='ST'
003 $Text=sprintf: fmt='Station: %s', $station, null, null, null, null
004 send incoming message $Text to player: display it=[TRUE]
005 return null
Проверь... Это же легко 5 минут займёт..
123.rar |
Описание: |
|
Имя файла: |
123.rar |
Размер файла: |
42.05 KB |
Скачано: |
280 раз(а) |
_________________ На фоне космоса - человечество, всего лишь пыль!
Последний раз редактировалось: Thug (18:56 19-03-2021), всего редактировалось 2 раз(а) |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Thug : |
Игра Х3ТС-АР3.1 Специально удалил из скриптов всё лишнее и проверил ещё раз - увы, но работает...
|
А у меня на X3TC увы не работает.
Thug по ходу троль какой-то
_________________ Очевидное-невероятное |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
Точно! Проверил на Х3ТС3.4 - не видит станцию. Значит разные редакторы в разных версиях игры. Ну тогда спасибо за первый пост!
Сейчас перепишу скрипт, пусть будет универсальный... С Thug(-ом) там всё сложнее, чем с локальной переменной
Спасибо всем за помощь!
добавлено спустя 25 минут:
Раз такая фишка с разными редакторами в игре, то:
$station=[PLAYERSHIP]-> get local variable: name='STATION'
или
$Ship = get player ship
$Station = $Ship -> get local variable: name='STATION'
Есть ли разница? Как лучше?
_________________ На фоне космоса - человечество, всего лишь пыль!
Последний раз редактировалось: Thug (19:43 19-03-2021), всего редактировалось 1 раз |
|
|
DNA78
429 EGP
     Рейтинг канала: 9(1069) Репутация: 73 Сообщения: 1268 Откуда: Кыргызстан Зарегистрирован: 12.11.2008
 |
|
Пробуй, но скорее всего нет никакой разницы.
_________________ Очевидное-невероятное |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
Подскажите как найти скриптом корабль, у которого перед названием корабля добавлен символ? Например: есть корабль !Тукан Прототип и скрипт должен найти этот корабль в секторе.
Нечто подобное применено, когда по обозначенному кораблю, оборудуют другие корабли.
_________________ На фоне космоса - человечество, всего лишь пыль!
Последний раз редактировалось: Thug (22:33 24-03-2021), всего редактировалось 1 раз |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
Thug : |
Подскажите как найти скриптом корабль, у которого перед названием корабля добавлен символ?
|
1. Ищешь все корабли в секторе и записываешь в массив.
2. В цикле перебираешь корабли по одному.
3. Делаешь $name->get name $ship
4. С помощью этой команды проверяешь есть ли символ в имени корабля:
<RetVar> get substring of <Var/String> offset=<Var/Number> length=<Var/Number>
· Команда возвращает в переменную <RetVar> подстроку из строки <Var/String>, которя начинается с позиции <Var/Number> и имеет длину <Var/Number>. Следует учитывать, что элементы строки нумеруются с 0.
· Если в качества длины строки указать значение null - то будет скопирована подстрока от заданной позиции offset=<Var/Number> до конца исходной строки.
_________________ Пираты - наше всё! |
|
|
Thug
67 EGP
 Рейтинг канала: 3(26) Репутация: 4 Сообщения: 112 Откуда: Новороссийск Зарегистрирован: 11.11.2013
 |
|
Интересно, как в ТС можно бес проблемно поставить скрипт. Обычный setup - новая игра не видит, пока не активировать скрипт-редактор, а с восклицательным знаком !setup - видит и скрипт работает сразу, но появляется (modified). Есть ли выход? Или разработчики "замок" повесили?
Точно не помню, но кажется в Х3Реунион достаточно было перезагрузить первое сохранение новой игры и добавленные скрипты начинали работать...
_________________ На фоне космоса - человечество, всего лишь пыль! |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
Thug : |
но появляется (modified). Есть ли выход?
|
Есть. Добавить в скрипт цифровую подпись у разработчиков. Емнип в бонуспак вошли сторонние скрипты подписанные разработчиками. Только практического смысла не вижу. Мне вот (modified) вообще играть не мешает.
_________________ Пираты - наше всё! |
|
|
za4ot
524 EGP
     Рейтинг канала: 5(190) Репутация: 17 Сообщения: 3549 Откуда: Яма Изобилия Зарегистрирован: 08.08.2012
 |
|
Thug : |
Не хочешь взглянуть, могу в личку скинуть.
|
Хочу. Скидывай.
_________________ Пираты - наше всё! |
|
|
|
|
|
Канал X3: Terran Conflict ->
Модовый и скриптовый отсек X3: Terran Conflict: «[ДИСКУС]: Скриптописание. Проблемы и их решение.» |
|