Jump to content
Korean Random
valanchik

Почему вылетает клиент из-за этого кода? BigWorld.wg_collideSegment

Recommended Posts

Пытаюсь использовать эту функцию 

def isVehicleVisibleFromCamera(vehicle, aimCamera):
    for vehiclePoint in getVisibilityCheckPointsGen(vehicle):
        startPos = aimCamera.camera.position
        endPos = vehiclePoint
        testResStatic = BigWorld.wg_collideSegment(BigWorld.player().spaceID, startPos, endPos, 128)
        if testResStatic is None:
            testResDynamic = BigWorld.wg_collideDynamic(BigWorld.player().spaceID, startPos, endPos, BigWorld.player().playerVehicleID)
            return testResDynamic is None and True
        continue

    return False

но на строчке 

testResStatic = BigWorld.wg_collideSegment(BigWorld.player().spaceID, startPos, endPos, 128)

падает клиент.

В чём причина?

Мне на самом деле не надо знать о простреле танка и т.д. Мне надо знать, что танк находится в пределах экрана. Может кто знает какую-нить другую функцию для того чтобы это определить?

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites

Запускаете как? Через Орион? Тогда будет падать. Если запускать как мод в клиенте по стандарту то будет работать. Либо еще вариант запускать в Орионе но через callback.

1 час назад, valanchik сказал:

Мне на самом деле не надо знать о простреле танка и т.д. Мне надо знать, что танк находится в пределах экрана. Может кто знает какую-нить другую функцию для того чтобы это определить?

 

Поищи в исходниках функции трансляции пространственных координат в координаты экрана монитора. Такое там есть.

Share this post


Link to post

Short link
Share on other sites
6 minutes ago, StranikS_Scan said:

Запускаете как? Через Орион? Тогда будет падать. Если запускать как мод в клиенте по стандарту то будет работать. Либо еще вариант запускать в Орионе но через callback.

 

Поищи в исходниках функции трансляции пространственных координат в координаты экрана монитора. Такое там есть.

Спасибо за помощь.

По координатам решил так:

from AvatarInputHandler import cameras

if cameras.isPointOnScreen(vehicle.position):

    .....

 

вопрос закрыт

Share this post


Link to post

Short link
Share on other sites
19 часов назад, StranikS_Scan сказал:

Запускаете как? Через Орион? Тогда будет падать. Если запускать как мод в клиенте по стандарту то будет работать. Либо еще вариант запускать в Орионе но через callback.

 

Тут скорее можно обобщить, нативные функции можно запускать только из основного потока интерпретатора.

Share this post


Link to post

Short link
Share on other sites
4 часа назад, Mixaill сказал:

 

Тут скорее можно обобщить, нативные функции можно запускать только из основного потока интерпретатора.

 

И с путча вроде 1.0. А до этого все нормально работало и из потоков.

Share this post


Link to post

Short link
Share on other sites
On 5/11/2020 at 9:21 PM, StranikS_Scan said:

 

И с путча вроде 1.0. А до этого все нормально работало и из потоков.

Может подскажешь  как в BigWorld.wg_collideSegment использовать callback?

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites
7 минут назад, valanchik сказал:

Может подскажешь  как в BigWorld.wg_collideSegment использовать callback?

 

"в BigWorld.wg_collideSegment" ни как. Посмотри примеры вызова callback в исходниках игры и быстро поймешь что я имел ввиду.

Share this post


Link to post

Short link
Share on other sites
1 hour ago, StranikS_Scan said:

 

"в BigWorld.wg_collideSegment" ни как. Посмотри примеры вызова callback в исходниках игры и быстро поймешь что я имел ввиду.

Хитёр... :) 

Короче я типа разобрался. Для того чтобы можно было использовать BigWorld.wg_collideSegment в pjorion - надо чуток изменить подход.

Исходный пример, который приводит к крашу игры:

def isVehicleVisibleFromCamera(vehicle, aimCamera):
    for vehiclePoint in getVisibilityCheckPointsGen(vehicle):
        startPos = aimCamera.camera.position
        endPos = vehiclePoint
        testResStatic = BigWorld.wg_collideSegment(BigWorld.player().spaceID, startPos, endPos, 128)
        if testResStatic is None:
            testResDynamic = BigWorld.wg_collideDynamic(BigWorld.player().spaceID, startPos, endPos, BigWorld.player().playerVehicleID)
            return testResDynamic is None and True
        continue
    return False

А вот так(через опу) можно получить данные без вылета клиента:

def callbackCollisionSegment(startPos, endPos):
    testResStatic = BigWorld.wg_collideSegment(BigWorld.player().spaceID, startPos, endPos, 128)
    if testResStatic is None:
        testResDynamic = BigWorld.wg_collideDynamic(BigWorld.player().spaceID, startPos, endPos, BigWorld.player().playerVehicleID)
        resultCollisionSegment(testResDynamic is None and True)
    return resultCollisionSegment(False)
def resultCollisionSegment(result):
    print result
def isVehicleVisibleFromCamera(vehicle, aimCamera):
    for vehiclePoint in getVisibilityCheckPointsGen(vehicle):
        startPos = aimCamera.camera.position
        endPos = vehiclePoint
        cb = BigWorld.callback(0.0, partial(callbackCollisionSegment, startPos, endPos))
        continue
    return False

Как видно из

cb = BigWorld.callback...

возвращается id таймера, который мы можем, если надо, очистить вот так:

BigWorld.cancelCallback(cb)

я хз есть ли ограничение на кол-во таймеров у ВГ и когда он вылетит если не делать

BigWorld.cancelCallback(cb)

но и так пока работает :)

Edited by valanchik

Share this post


Link to post

Short link
Share on other sites
19 минут назад, valanchik сказал:

очистить

 

Не очистить, а изъять вызов из очереди вызовов и тем самым отменить его выполнение.

 

19 минут назад, valanchik сказал:

я хз есть ли ограничение на кол-во таймеров у ВГ и когда он вылетит если не делать

 

В пайтоне сборщик мусорного кода работает, что не юзается, то собирается и уничтожается. Поэтому не надо самому память распределять и очищать.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites
1 minute ago, StranikS_Scan said:

 

Не очистить, а изъять вызов из очереди вызовов

 

 

В пайтоне сборщик мусорного кода работает, что не юзается, то собирается и уничтожается. Поэтому не надо самому память распределять и очищать.

ок. я в пайтоне нифига не шарю. От неизбежности иногда приходится что-то на нём делать. Вот жду не дождусь когда уже это кончится и переходить к серверной части :)

Share this post


Link to post

Short link
Share on other sites

Hello, I have the same problem. I understand that I need to call the BigWorld.wg_collideSegment function inside of BigWorld.callback(...) but I have a global function called "run_all" that runs the entire mod, why can't I simply put run_all in the BigWorld.callback() ? I tried and it does not change anything (wot client does not respond after some calls). I'm doing this because I want the collidesegment call to be synchronised (wait for it)

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...