#author("2024-11-20T13:26:33+00:00","default:iseki","iseki")
*** llGroundSet(int x, int y, double height), llGroundUpdate() [#ndfa0172]
**** OS Function に同じような osTerrainSetHeight(), osTerrainFlush() があった. [#fe17e745]

- llGroundSet(): 座標 (x, y) の標高を height にする関数.
- llGroundUpdate(): 変更した標高を適用させる.
- OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
        // Fumi.Iseki
        public void llGroundSet(int x, int y, double height)
        {       
            m_host.AddScriptLPS(1);
                
            if (World.Permissions.CanTerraformLand(m_host.OwnerID, new Vector3(x,y,0)))
            {
                if (x>=World.Heightmap.Width)  x = World.Heightmap.Width - 1;
                else if (x<0) x = 0;
                if (y>=World.Heightmap.Height) y = World.Heightmap.Height - 1;
                else if (y<0) y = 0; 
                World.Heightmap[x, y] = height;
            }
        }   
            
        // Fumi.Iseki
        public void llGroundUpdate()
        {   
            m_host.AddScriptLPS(1);
 
            ITerrainModule tm = m_ScriptEngine.World.RequestModuleInterface<ITerrainModule>();
            if (tm != null)
            {
                tm.TaintTerrain();
            }
        }
- OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs      
        // Fumi.Iseki
        public void llGroundSet(int x, int y, double height)
        {
            m_LSL_Functions.llGroundSet(x, y, height);
        }
 
        // Fumi.Iseki
        public void llGroundUpdate()
        {
            m_LSL_Functions.llGroundUpdate();
        }
- OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
 void llGroundSet(int x, int y, double height);
 void llGroundUpdate();

*** 別解:TerrainModule.cs に SetHeightMap() 関数を追加する場合 [#pc196495]
- OpenSim/Region/ScriptEngine編集/Shared/Api/Implementation/LSL_Api.cs 
       // Fumi.Iseki
        public void llGroundSet(int x, int y, double height)
        {       
            m_host.AddScriptLPS(1);
                
            if (World.Permissions.CanTerraformLand(m_host.OwnerID, new Vector3(x,y,0)))
            {
                ITerrainModule tm = m_ScriptEngine.World.RequestModuleInterface<ITerrainModule>();
                if (tm != null)
                {
                    if (x>=World.Heightmap.Width)  x = World.Heightmap.Width - 1;
                    else if (x<0) x = 0;
                    if (y>=World.Heightmap.Height) y = World.Heightmap.Height - 1;
                    else if (y<0) y = 0; 
                    tm.SetHeightMap(x, y, height, m_host.OwnerID);
                }
            }
        } 
- OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
 public void SetHeightMap(int x, int y, double height, UUID agentId)
 {
     if (m_scene.Permissions.CanTerraformLand(agentId, new Vector3(x,y,0)))
     {
         m_channel[x, y] = height;
     }
  }
-- チェックが2重だな

- OpenSim/Region/Framework/Interfaces/ITerrainModule.cs  (インターフェイス)
 void SetHeightMap(int x, int y, double height, UUID agentId)


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 ページ一覧 検索 最終更新   ヘルプ   最終更新のRSS